Jeff,
  Thanks a lot for your comments.

  The widen shift mode is on i1/i2 before they're combined with i3 to newpat.
The newpat matches rotate/mask pattern. The i1/i2 itself don't match
rotate/mask pattern.

  I did an experiment to disable widen shift mode for
lshiftrt. I tested it on powerpc/x86/aarch64. There is no regression occurred.
I thought that the widen shift mode is helpful for newpat matching. But it seems
not, at least no impact on powerpc/x86/aarch64.

diff --git a/gcc/combine.cc b/gcc/combine.cc
index 4bf867d74b0..0b9b115f9bb 100644
--- a/gcc/combine.cc
+++ b/gcc/combine.cc
@@ -10479,11 +10479,6 @@ try_widen_shift_mode (enum rtx_code code, rtx op, int 
count,
       return orig_mode;

     case LSHIFTRT:
-      /* Similarly here but with zero bits.  */
-      if (HWI_COMPUTABLE_MODE_P (mode)
-         && (nonzero_bits (op, mode) & ~GET_MODE_MASK (orig_mode)) == 0)
-       return mode;
-
       /* We can also widen if the bits brought in will be masked off.  This
         operation is performed in ORIG_MODE.  */
       if (outer_code == AND)

Segher,
  Could you inform me what's the purpose of widen shift mode in
simplify_shift_const? Does it definitely reduce the rtx cost or it helps match
patterns? Thanks a lot.

Thanks
Gui Haochen


在 2023/8/5 7:32, Jeff Law 写道:
> 
> 
> On 7/20/23 18:59, HAO CHEN GUI wrote:
>> Hi Jeff,
>>
>> 在 2023/7/21 5:27, Jeff Law 写道:
>>> Wouldn't it make more sense to just try rotate/mask in the original mode 
>>> before trying a shift in a widened mode?  I'm not sure why we need a target 
>>> hook here.
>>
>> There is no change to try rotate/mask with the original mode when
>> expensive_optimizations is set. The subst widens the shift mode.
> But we can add it before the attempt in the wider mode.
> 
>>
>>        if (flag_expensive_optimizations)
>>          {
>>            /* Pass pc_rtx so no substitutions are done, just
>>               simplifications.  */
>>            if (i1)
>>              {
>>                subst_low_luid = DF_INSN_LUID (i1);
>>                i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
>>              }
>>
>>            subst_low_luid = DF_INSN_LUID (i2);
>>            i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
>>          }
>>
>> I don't know if the wider mode is helpful to other targets, so
>> I added the target hook.
> In this scenario we're often better off relying on rtx_costs (even with all 
> its warts) rather than adding yet another target hook.
> 
> I'd love to hear from Segher here to see if he's got other ideas.
> 
> jeff

Reply via email to