[llvm] r184575 - Fix PR16360

Michael Liao michael.liao at intel.com
Fri Jun 21 13:02:39 PDT 2013


Hi Nadav

That patch make that transformation semantically correct as (srl
(anyextend x), c) will clear off the high bits but (anyextend (srl x,
c)) will leave high bits undefined.

BTW, PR16360 is not a target specific issue as reported
http://llvm.org/bugs/show_bug.cgi?id=16360

Thanks
- Michael

On Fri, 2013-06-21 at 12:22 -0700, Nadav Rotem wrote:
> It is not clear to me why this transformation is profitable for all
> platforms. You are adding an AND operation here. Should this
> optimization be target specific maybe ?
> 
> On Jun 21, 2013, at 11:45 AM, Michael Liao <michael.liao at intel.com>
> wrote:
> 
> > Author: hliao
> > Date: Fri Jun 21 13:45:27 2013
> > New Revision: 184575
> > 
> > URL: http://llvm.org/viewvc/llvm-project?rev=184575&view=rev
> > Log:
> > Fix PR16360
> > 
> > When (srl (anyextend x), c) is folded into (anyextend (srl x, c)),
> > the
> > high bits are not cleared. Add 'and' to clear off them.
> > 
> > 
> > Added:
> >    llvm/trunk/test/CodeGen/X86/pr16360.ll
> > Modified:
> >    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> > 
> > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=184575&r1=184574&r2=184575&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Jun 21
> > 13:45:27 2013
> > @@ -3915,8 +3915,7 @@ SDValue DAGCombiner::visitSRL(SDNode *N)
> >                        DAG.getConstant(~0ULL >> ShAmt, VT));
> >   }
> > 
> > -
> > -  // fold (srl (anyextend x), c) -> (anyextend (srl x, c))
> > +  // fold (srl (anyextend x), c) -> (and (anyextend (srl x, c)),
> > mask)
> >   if (N1C && N0.getOpcode() == ISD::ANY_EXTEND) {
> >     // Shifting in all undef bits?
> >     EVT SmallVT = N0.getOperand(0).getValueType();
> > @@ -3929,7 +3928,10 @@ SDValue DAGCombiner::visitSRL(SDNode *N)
> >                                        N0.getOperand(0),
> >                           DAG.getConstant(ShiftAmt,
> > getShiftAmountTy(SmallVT)));
> >       AddToWorkList(SmallShift.getNode());
> > -      return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), VT,
> > SmallShift);
> > +      APInt Mask =
> > APInt::getAllOnesValue(VT.getSizeInBits()).lshr(ShiftAmt);
> > +      return DAG.getNode(ISD::AND, SDLoc(N), VT,
> > +                         DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), VT,
> > SmallShift),
> > +                         DAG.getConstant(Mask, VT));
> >     }
> >   }
> > 
> > 
> > Added: llvm/trunk/test/CodeGen/X86/pr16360.ll
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr16360.ll?rev=184575&view=auto
> > ==============================================================================
> > --- llvm/trunk/test/CodeGen/X86/pr16360.ll (added)
> > +++ llvm/trunk/test/CodeGen/X86/pr16360.ll Fri Jun 21 13:45:27 2013
> > @@ -0,0 +1,16 @@
> > +; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s
> > +
> > +define i64 @foo(i32 %sum) {
> > +entry:
> > +  %conv = sext i32 %sum to i64
> > +  %shr = lshr i64 %conv, 2
> > +  %or = or i64 4611686018360279040, %shr
> > +  ret i64 %or
> > +}
> > +
> > +; CHECK: foo
> > +; CHECK: shrl $2
> > +; CHECK: orl $-67108864
> > +; CHECK-NOT: movl $-1
> > +; CHECK: movl $1073741823
> > +; CHECK: ret
> > 
> > 
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 





More information about the llvm-commits mailing list