Segher Boessenkool writes:

> Hi!
>
> On Thu, Dec 13, 2018 at 09:39:52AM +0000, senthilkumar.selva...@microchip.com 
> wrote:
>>   When debugging PR 88253, I found that force_to_mode uses a parameter
>>   (just_select) to prevent the function from returning a const0_rtx even
>>   if none of the bits set by the rtx are needed. The comment says
>>
>>    "If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
>>    are all off in X.  This is used when X will be complemented, by either
>>    NOT, NEG, or XOR."
>>
>>    and the code behaves the same way, but could someone help me
>>    understand why?
>
> This was introduced in https://gcc.gnu.org/r6342 .

Yep :). Was hoping someone would have run into a similar situation,
although trawling the gcc mailing lists didn't turn up anything useful.
>
>
>>    I ran into this, when I found that force_to_mode converts
>>
>>    (ior:QI (subreg:QI (ior:HI (ashift:HI (zero_extend:HI (reg/v:QI 46 [ h ]))
>>                 (const_int 8 [0x8]))
>>             (reg:HI 55 [ D.1627 ])) 0)
>>     (const_int 42 [0x2a]))
>>
>>     into
>>
>>    (set (reg:QI 44 [ D.1626 ])
>>       (ior:QI (subreg:QI (reg:HI 55 [ D.1627 ]) 0)
>>           (const_int 42 [0x2a])))
>>
>>    but is unable to do the same thing for the below rtx.
>>
>>    (xor:QI (subreg:QI (ior:HI (ashift:HI (zero_extend:HI (reg/v:QI 46 [ h ]))
>>                 (const_int 8 [0x8]))
>>             (reg:HI 55 [ D.1627 ])) 0)
>>     (reg:QI 58))
>>
>>    The only difference is the xor instead of ior at the outermost sexp,
>>    and force_to_mode returns
>>
>>    (set (reg:QI 44 [ D.1626 ])
>>     (xor:QI (ior:QI (subreg:QI (ashift:HI (zero_extend:HI (reg/v:QI 46 [ h 
>> ]))
>>                     (const_int 8 [0x8])) 0)
>>             (subreg:QI (reg:HI 55 [ D.1627 ]) 0))
>>         (reg:QI 58)))
>>
>>    This more complicated pattern doesn't match, and combine
>>    moves on to another combination of insns, eventually resulting in PR 
>> 88253.
>
> Combine not doing some combination is never incorrect, of course (just not
> what you want, possibly, but not the cause of a bug :-) )

Understood. The bug report said the PR does not show up for a bitwise
OR, so just wanted to convey that this is where the divergence
between the RTL for a bitwise OR vs XOR starts.
>
>>    Isn't the simplification of
>>
>>    (subreg:QI (ior:HI (ashift:HI (zero_extend:HI (reg/v:QI 46 [ h ]))
>>                 (const_int 8 [0x8]))
>>             (reg:HI 55 [ D.1627 ]))
>>
>>    to
>>
>>    (subreg:QI (reg:HI 55 [ D.1627 ])
>>
>>    safe to do, wheter the outer insn code is XOR or IOR?
>
> Probably.

I was wondering if I should put out a patch that resets just_select for
(the nested) IOR's operands, but maybe I should leave this untouched. As
you said, this is more a missed optimization, and shouldn't really cause
any bugs.
>
> (Please don't paste lines full of spaces in your emails, it is hard to read).

Apologies, didn't notice that.

Regards
Senthil

Reply via email to