enhance the previous optimization to work with fcmp in addition
authorChris Lattner <sabre@nondot.org>
Sat, 2 Jan 2010 08:20:51 +0000 (08:20 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 2 Jan 2010 08:20:51 +0000 (08:20 +0000)
to icmp.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92412 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/load-cmp.ll

index 1fcc64efe905e11e4863088788c4b4f95b1d6c99..05da044e38945ebbe22c268249d4232f32a707e7 100644 (file)
@@ -6180,7 +6180,7 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
         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 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
           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 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
 
       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;
       }
   }
index f410939e702a67dab0d2da3295f1e807cb4a1507..eac9ae495dc493c2c6e997b3f07c5fe4da5306d0 100644 (file)
@@ -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]
+@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 @@ define i1 @test2(i32 %X) {
 ; 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
+}
+