[llvm-commits] [llvm] r128388 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineSelect.cpp test/Transforms/InstCombine/select.ll

Nick Lewycky nicholas at mxc.ca
Sun Mar 27 12:51:23 PDT 2011


Author: nicholas
Date: Sun Mar 27 14:51:23 2011
New Revision: 128388

URL: http://llvm.org/viewvc/llvm-project?rev=128388&view=rev
Log:
Teach the transformation that moves binary operators around selects to preserve
the subclass optional data.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
    llvm/trunk/test/Transforms/InstCombine/select.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp?rev=128388&r1=128387&r2=128388&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineSelect.cpp Sun Mar 27 14:51:23 2011
@@ -214,7 +214,7 @@
         unsigned OpToFold = 0;
         if ((SFO & 1) && FalseVal == TVI->getOperand(0)) {
           OpToFold = 1;
-        } else  if ((SFO & 2) && FalseVal == TVI->getOperand(1)) {
+        } else if ((SFO & 2) && FalseVal == TVI->getOperand(1)) {
           OpToFold = 2;
         }
 
@@ -227,9 +227,16 @@
             Instruction *NewSel = SelectInst::Create(SI.getCondition(), OOp, C);
             InsertNewInstBefore(NewSel, SI);
             NewSel->takeName(TVI);
-            if (BinaryOperator *BO = dyn_cast<BinaryOperator>(TVI))
-              return BinaryOperator::Create(BO->getOpcode(), FalseVal, NewSel);
-            llvm_unreachable("Unknown instruction!!");
+	    BinaryOperator *TVI_BO = cast<BinaryOperator>(TVI);
+            BinaryOperator *BO = BinaryOperator::Create(TVI_BO->getOpcode(),
+                                                        FalseVal, NewSel);
+	    if (isa<PossiblyExactOperator>(BO))
+	      BO->setIsExact(TVI_BO->isExact());
+	    if (isa<OverflowingBinaryOperator>(BO)) {
+	      BO->setHasNoUnsignedWrap(TVI_BO->hasNoUnsignedWrap());
+	      BO->setHasNoSignedWrap(TVI_BO->hasNoSignedWrap());
+	    }
+	    return BO;
           }
         }
       }
@@ -243,7 +250,7 @@
         unsigned OpToFold = 0;
         if ((SFO & 1) && TrueVal == FVI->getOperand(0)) {
           OpToFold = 1;
-        } else  if ((SFO & 2) && TrueVal == FVI->getOperand(1)) {
+        } else if ((SFO & 2) && TrueVal == FVI->getOperand(1)) {
           OpToFold = 2;
         }
 
@@ -256,9 +263,16 @@
             Instruction *NewSel = SelectInst::Create(SI.getCondition(), C, OOp);
             InsertNewInstBefore(NewSel, SI);
             NewSel->takeName(FVI);
-            if (BinaryOperator *BO = dyn_cast<BinaryOperator>(FVI))
-              return BinaryOperator::Create(BO->getOpcode(), TrueVal, NewSel);
-            llvm_unreachable("Unknown instruction!!");
+            BinaryOperator *FVI_BO = cast<BinaryOperator>(FVI);
+            BinaryOperator *BO = BinaryOperator::Create(FVI_BO->getOpcode(),
+                                                        TrueVal, NewSel);
+	    if (isa<PossiblyExactOperator>(BO))
+	      BO->setIsExact(FVI_BO->isExact());
+	    if (isa<OverflowingBinaryOperator>(BO)) {
+	      BO->setHasNoUnsignedWrap(FVI_BO->hasNoUnsignedWrap());
+	      BO->setHasNoSignedWrap(FVI_BO->hasNoSignedWrap());
+	    }
+	    return BO;
           }
         }
       }

Modified: llvm/trunk/test/Transforms/InstCombine/select.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/select.ll?rev=128388&r1=128387&r2=128388&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/select.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/select.ll Sun Mar 27 14:51:23 2011
@@ -737,3 +737,15 @@
 ; CHECK: zext 
 ; CHECK: ret
 }
+
+define i1 @test55(i1 %X, i32 %Y, i32 %Z) {
+  %A = ashr exact i32 %Y, %Z
+  %B = select i1 %X, i32 %Y, i32 %A
+  %C = icmp eq i32 %B, 0
+  ret i1 %C
+; CHECK: @test55
+; CHECK-NOT: ashr
+; CHECK-NOT: select
+; CHECK: icmp eq
+; CHECK: ret i1
+}





More information about the llvm-commits mailing list