[llvm-commits] [llvm] r91378 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/setcc.ll test/CodeGen/X86/zext-shl.ll

Chris Lattner clattner at apple.com
Mon Dec 14 17:00:01 PST 2009


On Dec 14, 2009, at 4:41 PM, Evan Cheng wrote:

> Author: evancheng
> Date: Mon Dec 14 18:41:36 2009
> New Revision: 91378
>
> URL: http://llvm.org/viewvc/llvm-project?rev=91378&view=rev
> Log:
> Propagate zest through logical shift.

Is this really profitable in the general case?  It seems that this  
should only be done if at least one of the inputs to the shift will  
fold away.  Adding a nice "WouldFoldAZExt" predicate that would return  
true for zext/trunc would make sense, no?

-Chris

>
> Added:
>    llvm/trunk/test/CodeGen/X86/setcc.ll
>    llvm/trunk/test/CodeGen/X86/zext-shl.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=91378&r1=91377&r2=91378&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Dec 14  
> 18:41:36 2009
> @@ -3278,6 +3278,16 @@
>     if (SCC.getNode()) return SCC;
>   }
>
> +  // (zext (shl (zext x), y)) -> (shl (zext x), (zext y))
> +  if ((N0.getOpcode() == ISD::SHL || N0.getOpcode() == ISD::SRL) &&
> +      N0.getOperand(0).getOpcode() == ISD::ZERO_EXTEND &&
> +      N0.hasOneUse()) {
> +    DebugLoc dl = N->getDebugLoc();
> +    return DAG.getNode(N0.getOpcode(), dl, VT,
> +                       DAG.getNode(ISD::ZERO_EXTEND, dl, VT,  
> N0.getOperand(0)),
> +                       DAG.getNode(ISD::ZERO_EXTEND, dl, VT,  
> N0.getOperand(1)));
> +  }
> +
>   return SDValue();
> }
>
>
> Added: llvm/trunk/test/CodeGen/X86/setcc.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/setcc.ll?rev=91378&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/setcc.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/setcc.ll Mon Dec 14 18:41:36 2009
> @@ -0,0 +1,13 @@
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
> +
> +define zeroext i16 @t1(i16 zeroext %x) nounwind readnone ssp {
> +entry:
> +; CHECK: t1:
> +; CHECK: seta %al
> +; CHECK: movzbl %al, %eax
> +; CHECK: shll $5, %eax
> +  %0 = icmp ugt i16 %x, 26                        ; <i1> [#uses=1]
> +  %iftmp.1.0 = select i1 %0, i16 32, i16 0        ; <i16> [#uses=1]
> +  ret i16 %iftmp.1.0
> +}
> +
>
> Added: llvm/trunk/test/CodeGen/X86/zext-shl.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/zext-shl.ll?rev=91378&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/zext-shl.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/zext-shl.ll Mon Dec 14 18:41:36 2009
> @@ -0,0 +1,38 @@
> +; RUN: llc < %s -march=x86 | FileCheck %s
> +
> +define i32 @t1(i8 zeroext %x) nounwind readnone ssp {
> +entry:
> +; CHECK: t1:
> +; CHECK: shll
> +; CHECK-NOT: movzwl
> +; CHECK: ret
> +  %0 = zext i8 %x to i16
> +  %1 = shl i16 %0, 5
> +  %2 = zext i16 %1 to i32
> +  ret i32 %2
> +}
> +
> +define i32 @t2(i8 zeroext %x) nounwind readnone ssp {
> +entry:
> +; CHECK: t2:
> +; CHECK: shrl
> +; CHECK-NOT: movzwl
> +; CHECK: ret
> +  %0 = zext i8 %x to i16
> +  %1 = lshr i16 %0, 3
> +  %2 = zext i16 %1 to i32
> +  ret i32 %2
> +}
> +
> +define i32 @t3(i8 zeroext %x, i8 zeroext %y) nounwind readnone ssp {
> +entry:
> +; CHECK: t3:
> +; CHECK: shll
> +; CHECK-NOT: movzwl
> +; CHECK: ret
> +  %0 = zext i8 %x to i16
> +  %1 = zext i8 %y to i16
> +  %2 = shl i16 %0, %1
> +  %3 = zext i16 %2 to i32
> +  ret i32 %3
> +}
>
>
> _______________________________________________
> 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