[llvm-commits] [llvm] r67730 - in /llvm/branches/Apple/Dib: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/2009-03-25-TestBug.ll

Bill Wendling isanbard at gmail.com
Wed Mar 25 18:54:23 PDT 2009


Author: void
Date: Wed Mar 25 20:54:23 2009
New Revision: 67730

URL: http://llvm.org/viewvc/llvm-project?rev=67730&view=rev
Log:
--- Merging (from foreign repository) r67728 into '.':
U    lib/Target/X86/X86ISelLowering.cpp
A    test/CodeGen/X86/2009-03-25-TestBug.ll

Match this pattern so that we can generate simpler code:

  %a = ...
  %b = and i32 %a, 2
  %c = srl i32 %b, 1
  %d = br i32 %c, 

into

  %a = ...
  %b = and %a, 2
  %c = X86ISD::CMP %b, 0
  %d = X86ISD::BRCOND %c ...

This applies only when the AND constant value has one bit set and the SRL
constant is equal to the log2 of the AND constant. The back-end is smart enough
to convert the result into a TEST/JMP sequence.

Added:
    llvm/branches/Apple/Dib/test/CodeGen/X86/2009-03-25-TestBug.ll
Modified:
    llvm/branches/Apple/Dib/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/branches/Apple/Dib/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/Target/X86/X86ISelLowering.cpp?rev=67730&r1=67729&r2=67730&view=diff

==============================================================================
--- llvm/branches/Apple/Dib/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/branches/Apple/Dib/lib/Target/X86/X86ISelLowering.cpp Wed Mar 25 20:54:23 2009
@@ -5870,6 +5870,45 @@
       CC = DAG.getConstant(CCode, MVT::i8);
       Cond = Cond.getOperand(0).getOperand(1);
       addTest = false;
+    } else if (Cond.hasOneUse() && Cond.getOpcode() == ISD::SRL) {
+      // Match this pattern so that we can generate simpler code:
+      //
+      //   %a = ...
+      //   %b = and i32 %a, 2
+      //   %c = srl i32 %b, 1
+      //   %d = br i32 %c, 
+      //
+      // into
+      // 
+      //   %a = ...
+      //   %b = and %a, 2
+      //   %c = X86ISD::CMP %b, 0
+      //   %d = X86ISD::BRCOND %c ...
+      //
+      // This applies only when the AND constant value has one bit set and the
+      // SRL constant is equal to the log2 of the AND constant. The back-end is
+      // smart enough to convert the result into a TEST/JMP sequence.
+      SDValue Op0 = Cond.getOperand(0);
+      SDValue Op1 = Cond.getOperand(1);
+
+      if (Op0.getOpcode() == ISD::AND &&
+          Op0.hasOneUse() &&
+          Op1.getOpcode() == ISD::Constant) {
+        SDValue AndOp0 = Op0.getOperand(0);
+        SDValue AndOp1 = Op0.getOperand(1);
+
+        if (AndOp1.getOpcode() == ISD::Constant) {
+          const APInt &AndConst = cast<ConstantSDNode>(AndOp1)->getAPIntValue();
+
+          if (AndConst.isPowerOf2() &&
+              cast<ConstantSDNode>(Op1)->getAPIntValue()==AndConst.logBase2()) {
+            CC = DAG.getConstant(X86::COND_NE, MVT::i8);
+            Cond = EmitTest(Op0, X86::COND_NE, DAG);
+            return DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
+                               Chain, Dest, CC, Cond);
+          }
+        }
+      }
     }
   }
 

Added: llvm/branches/Apple/Dib/test/CodeGen/X86/2009-03-25-TestBug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/test/CodeGen/X86/2009-03-25-TestBug.ll?rev=67730&view=auto

==============================================================================
--- llvm/branches/Apple/Dib/test/CodeGen/X86/2009-03-25-TestBug.ll (added)
+++ llvm/branches/Apple/Dib/test/CodeGen/X86/2009-03-25-TestBug.ll Wed Mar 25 20:54:23 2009
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | llc -o %t
+; RUN: not grep and %t
+; RUN: not grep shr %t
+; rdar://6661955
+
+ at hello = internal constant [7 x i8] c"hello\0A\00"
+ at world = internal constant [7 x i8] c"world\0A\00"
+
+define void @func(i32* %b) {
+bb1579.i.i:		; preds = %bb1514.i.i, %bb191.i.i
+	%tmp176 = load i32* %b, align 4
+	%tmp177 = and i32 %tmp176, 2
+	%tmp178 = icmp eq i32 %tmp177, 0
+        br i1 %tmp178, label %hello, label %world
+
+hello:
+	%h = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([7 x i8]* @hello, i32 0, i32 0))
+        ret void
+
+world:
+	%w = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([7 x i8]* @world, i32 0, i32 0))
+        ret void
+}
+
+declare i32 @printf(i8*, ...) nounwind





More information about the llvm-commits mailing list