While SimplifyDemandedBits constant folds this, we can't rely on it here.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sat, 2 Apr 2011 18:50:58 +0000 (18:50 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sat, 2 Apr 2011 18:50:58 +0000 (18:50 +0000)
It's possible to craft an input that hits the recursion limits in a way
that SimplifyDemandedBits doesn't simplify the icmp but ComputeMaskedBits
can infer which bits are zero.

No test case as it depends on too many other things. Fixes PR9609.

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

lib/Transforms/InstCombine/InstCombineCasts.cpp

index 32ab123f103929609d293d8edcc6c7454c1fa37d..6f70de86576429927187036794d2750bcc87b14a 100644 (file)
@@ -913,8 +913,13 @@ Instruction *InstCombiner::transformSExtICmp(ICmpInst *ICI, Instruction &CI) {
       if (KnownZeroMask.isPowerOf2()) {
         Value *In = ICI->getOperand(0);
 
-        assert((Op1C->isZero() || Op1C->getValue() == KnownZeroMask) &&
-               "Constant icmp not folded?");
+        // If the icmp tests for a known zero bit we can constant fold it.
+        if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
+          Value *V = Pred == ICmpInst::ICMP_NE ?
+                       ConstantInt::getAllOnesValue(CI.getType()) :
+                       ConstantInt::getNullValue(CI.getType());
+          return ReplaceInstUsesWith(CI, V);
+        }
 
         if (!Op1C->isZero() == (Pred == ICmpInst::ICMP_NE)) {
           // sext ((x & 2^n) == 0)   -> (x >> n) - 1