[llvm-commits] [llvm] r92412 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/load-cmp.ll

Chris Lattner sabre at nondot.org
Sat Jan 2 00:20:51 PST 2010


Author: lattner
Date: Sat Jan  2 02:20:51 2010
New Revision: 92412

URL: http://llvm.org/viewvc/llvm-project?rev=92412&view=rev
Log:
enhance the previous optimization to work with fcmp in addition
to icmp.

Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/load-cmp.ll

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=92412&r1=92411&r2=92412&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sat Jan  2 02:20:51 2010
@@ -6180,7 +6180,7 @@
         if (Instruction *NV = FoldFCmp_IntToFP_Cst(I, LHSI, RHSC))
           return NV;
         break;
-      case Instruction::Select:
+      case Instruction::Select: {
         // If either operand of the select is a constant, we can fold the
         // comparison into the select arms, which will cause one to be
         // constant folded and the select turned into a bitwise or.
@@ -6205,6 +6205,20 @@
           return SelectInst::Create(LHSI->getOperand(0), Op1, Op2);
         break;
       }
+    case Instruction::Load:
+      if (GetElementPtrInst *GEP =
+          dyn_cast<GetElementPtrInst>(LHSI->getOperand(0))) {
+        if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
+          if (GV->isConstant() && GV->hasDefinitiveInitializer() &&
+              !cast<LoadInst>(LHSI)->isVolatile())
+            if (Instruction *Res = FoldCmpLoadFromIndexedGlobal(GEP, GV, I))
+              return Res;
+            //errs() << "NOT HANDLED: " << *GV << "\n";
+            //errs() << "\t" << *GEP << "\n";
+            //errs() << "\t " << I << "\n\n\n";
+      }
+      break;
+    }
   }
 
   return Changed ? &I : 0;
@@ -6586,13 +6600,16 @@
 
       case Instruction::Load:
         if (GetElementPtrInst *GEP =
-              dyn_cast<GetElementPtrInst>(LHSI->getOperand(0)))
+              dyn_cast<GetElementPtrInst>(LHSI->getOperand(0))) {
           if (GlobalVariable *GV = dyn_cast<GlobalVariable>(GEP->getOperand(0)))
             if (GV->isConstant() && GV->hasDefinitiveInitializer() &&
-                !cast<LoadInst>(LHSI)->isVolatile()) {
+                !cast<LoadInst>(LHSI)->isVolatile())
               if (Instruction *Res = FoldCmpLoadFromIndexedGlobal(GEP, GV, I))
                 return Res;
-            }
+          //errs() << "NOT HANDLED: " << *GV << "\n";
+          //errs() << "\t" << *GEP << "\n";
+          //errs() << "\t " << I << "\n\n\n";
+        }
         break;
       }
   }

Modified: llvm/trunk/test/Transforms/InstCombine/load-cmp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/load-cmp.ll?rev=92412&r1=92411&r2=92412&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/load-cmp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/load-cmp.ll Sat Jan  2 02:20:51 2010
@@ -2,6 +2,7 @@
 
 @G16 = internal constant [10 x i16] [i16 35, i16 82, i16 69, i16 81, i16 85, 
                                      i16 73, i16 82, i16 69, i16 68, i16 0]
+ at GD = internal constant [3 x double] [double 1.0, double 4.0, double -20.0]
 
 define i1 @test1(i32 %X) {
   %P = getelementptr [10 x i16]* @G16, i32 0, i32 %X
@@ -23,3 +24,13 @@
 ; CHECK-NEXT: ret i1 %R
 }
 
+define i1 @test3(i32 %X) {
+  %P = getelementptr [3 x double]* @GD, i32 0, i32 %X
+  %Q = load double* %P
+  %R = fcmp oeq double %Q, 1.0
+  ret i1 %R
+; CHECK: @test3
+; CHECK-NEXT: %R = icmp eq i32 %X, 0
+; CHECK-NEXT: ret i1 %R
+}
+





More information about the llvm-commits mailing list