public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test
@ 2015-09-27 11:19 olegendo at gcc dot gnu.org
2015-09-28 11:12 ` [Bug rtl-optimization/67731] " rguenth at gcc dot gnu.org
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: olegendo at gcc dot gnu.org @ 2015-09-27 11:19 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
Bug ID: 67731
Summary: Combine of OR'ed bitfields should use bit-test
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: olegendo at gcc dot gnu.org
CC: rguenth at gcc dot gnu.org, segher at gcc dot gnu.org
Target Milestone: ---
Target: sh*-*-*
This is what happens on SH, but it's probably not entirely SH specific. All
examples below have been compiled with -x c -std=gnu11 -O2 -m4 -ml.
typedef struct
{
_Bool a : 1;
_Bool b : 1;
_Bool c : 1;
_Bool d : 1;
unsigned int e : 4;
} S;
_Bool test_00 (S* s)
{
return s->b | s->c;
}
compiles to:
mov.l @r4,r2
mov r2,r0
tst #2,r0 // bit test 'b'
mov #-1,r0
negc r0,r1
mov r2,r0
tst #4,r0 // bit test 'c'
mov #-1,r0
negc r0,r0
rts
or r1,r0
while the equivalent
_Bool test_01 (unsigned char* s)
{
return *s & ((1 << 1) | (1 << 2));
}
compiles to:
mov.b @r4,r0
mov #-1,r1
tst #6,r0 // bit test 'b' | 'c'
rts
negc r1,r0
For the bitfield case, combine is looking for a pattern:
Failed to match this instruction:
(set (reg:SI 180)
(ior:SI (zero_extract:SI (reg:SI 170 [ *s_2(D) ])
(const_int 1 [0x1])
(const_int 2 [0x2]))
(zero_extract:SI (reg:SI 170 [ *s_2(D) ])
(const_int 1 [0x1])
(const_int 1 [0x1]))))
Adding it to sh.md as:
(define_insn_and_split "*"
[(set (match_operand:SI 0 "arith_reg_dest")
(ior:SI (zero_extract:SI (match_operand:SI 1 "arith_reg_operand")
(const_int 1)
(match_operand 2 "const_int_operand"))
(zero_extract:SI (match_dup 1)
(const_int 1)
(match_operand 3 "const_int_operand"))))
(clobber (reg:SI T_REG))]
"TARGET_SH1 && can_create_pseudo_p ()"
"#"
"&& 1"
[(parallel [(set (match_dup 0)
(ne:SI (and:SI (match_dup 1) (match_dup 2)) (const_int 0)))
(clobber (reg:SI T_REG))])]
{
operands[2] = GEN_INT ((1LL << INTVAL (operands[2]))
| (1LL << INTVAL (operands[3])));
})
results in the expected code:
mov.l @r4,r0
tst #6,r0
mov #-1,r0
rts
negc r0,r0
Then...
_Bool test_03 (S* s)
{
return s->b | s->c | s->d;
}
results in combine looking for something like
Failed to match this instruction:
(set (reg:SI 195)
(and:SI (ior:SI (ior:SI (lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 2 [0x2]))
(lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 1 [0x1])))
(lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 3 [0x3])))
(const_int 1 [0x1])))
and for 4 bits it's
(set (reg:SI 204)
(and:SI (ior:SI (ior:SI (ior:SI (lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 2 [0x2]))
(lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 1 [0x1])))
(lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 3 [0x3])))
(lshiftrt:SI (reg:SI 173 [ *s_2(D) ])
(const_int 4 [0x4])))
(const_int 1 [0x1])))
and so on.
Although it's of course possible to add these with a recursive predicate the
the backend, maybe it could be a good idea to either do this at the tree-level
or in combine/simplify rtx. I think this is a problem on every target, not
just SH.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/67731] Combine of OR'ed bitfields should use bit-test
2015-09-27 11:19 [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test olegendo at gcc dot gnu.org
@ 2015-09-28 11:12 ` rguenth at gcc dot gnu.org
2015-09-28 14:15 ` olegendo at gcc dot gnu.org
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: rguenth at gcc dot gnu.org @ 2015-09-28 11:12 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2015-09-28
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, so usually this gets optimized by fold-const.c optimize_bit_field_compare
but
appearantly that doesn't work here. Not that I like this function very much...
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/67731] Combine of OR'ed bitfields should use bit-test
2015-09-27 11:19 [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test olegendo at gcc dot gnu.org
2015-09-28 11:12 ` [Bug rtl-optimization/67731] " rguenth at gcc dot gnu.org
@ 2015-09-28 14:15 ` olegendo at gcc dot gnu.org
2015-09-28 14:28 ` rguenther at suse dot de
2021-06-01 22:04 ` [Bug tree-optimization/67731] " pinskia at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: olegendo at gcc dot gnu.org @ 2015-09-28 14:15 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
--- Comment #2 from Oleg Endo <olegendo at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #1)
> Ok, so usually this gets optimized by fold-const.c
> optimize_bit_field_compare but
> appearantly that doesn't work here. Not that I like this function very
> much...
Can this one be handled by match.pd then? If so, can you please change this to
tree-opt?
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug rtl-optimization/67731] Combine of OR'ed bitfields should use bit-test
2015-09-27 11:19 [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test olegendo at gcc dot gnu.org
2015-09-28 11:12 ` [Bug rtl-optimization/67731] " rguenth at gcc dot gnu.org
2015-09-28 14:15 ` olegendo at gcc dot gnu.org
@ 2015-09-28 14:28 ` rguenther at suse dot de
2021-06-01 22:04 ` [Bug tree-optimization/67731] " pinskia at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: rguenther at suse dot de @ 2015-09-28 14:28 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> ---
On Mon, 28 Sep 2015, olegendo at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
>
> --- Comment #2 from Oleg Endo <olegendo at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #1)
> > Ok, so usually this gets optimized by fold-const.c
> > optimize_bit_field_compare but
> > appearantly that doesn't work here. Not that I like this function very
> > much...
>
> Can this one be handled by match.pd then? If so, can you please change
> this to tree-opt?
No, match.pd doesn't work with memory. The various patches to
lower bitfield accesses made this work automagically. Thus this
PR is probably a dup of some other(s).
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug tree-optimization/67731] Combine of OR'ed bitfields should use bit-test
2015-09-27 11:19 [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test olegendo at gcc dot gnu.org
` (2 preceding siblings ...)
2015-09-28 14:28 ` rguenther at suse dot de
@ 2021-06-01 22:04 ` pinskia at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-06-01 22:04 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67731
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org
Status|NEW |ASSIGNED
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Mine, this is bit-field lowering related.
I am hoping to get the bit-field lowering into GCC 12.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-06-01 22:04 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-27 11:19 [Bug rtl-optimization/67731] New: Combine of OR'ed bitfields should use bit-test olegendo at gcc dot gnu.org
2015-09-28 11:12 ` [Bug rtl-optimization/67731] " rguenth at gcc dot gnu.org
2015-09-28 14:15 ` olegendo at gcc dot gnu.org
2015-09-28 14:28 ` rguenther at suse dot de
2021-06-01 22:04 ` [Bug tree-optimization/67731] " pinskia at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).