]> granicus.if.org Git - llvm/commitdiff
[InstCombine] Fix a vector splat handling bug in transformZExtICmp.
authorCraig Topper <craig.topper@intel.com>
Thu, 5 Oct 2017 07:59:11 +0000 (07:59 +0000)
committerCraig Topper <craig.topper@intel.com>
Thu, 5 Oct 2017 07:59:11 +0000 (07:59 +0000)
We were using an i1 type and then zero extending to a vector. Instead just create the 0/1 directly as a ConstantInt with the correct type. No need to ask ConstantExpr to zero extend for us.

This bug is a bit tricky to hit because it requires us to visit a zext of an icmp that would normally be simplified to true/false, but that icmp hasnt' been visited yet. In the test case this zext and icmp were created by visiting a udiv and due to worklist ordering we got to the zext first.

Fixes PR34841.

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

lib/Transforms/InstCombine/InstCombineCasts.cpp
test/Transforms/InstCombine/div.ll

index f7be0f9bc3f334c533fcc5a00f7db711cfe6cacc..5e4fd8c265679b7a95060b21c2448676634420dd 100644 (file)
@@ -818,9 +818,7 @@ Instruction *InstCombiner::transformZExtICmp(ICmpInst *ICI, ZExtInst &CI,
         if (!Op1CV->isNullValue() && (*Op1CV != KnownZeroMask)) {
           // (X&4) == 2 --> false
           // (X&4) != 2 --> true
-          Constant *Res = ConstantInt::get(Type::getInt1Ty(CI.getContext()),
-                                           isNE);
-          Res = ConstantExpr::getZExt(Res, CI.getType());
+          Constant *Res = ConstantInt::get(CI.getType(), isNE);
           return replaceInstUsesWith(CI, Res);
         }
 
index b323e31e63ecf482d5aef9ffb9a91fddb0c6555a..42da1382f976a69b67c0972c937dff118009fc23 100644 (file)
@@ -553,3 +553,12 @@ define i32 @shrink_no3(i16 %x) {
   ret i32 %div
 }
 
+; This previously crashed when trying to simplify the zext/icmp this becomes.
+define <2 x i8> @PR34841(<2 x i8> %x) {
+; CHECK-LABEL: @PR34841(
+; CHECK-NEXT:    ret <2 x i8> zeroinitializer
+;
+  %neg = and <2 x i8> %x, <i8 2, i8 2>
+  %div = udiv <2 x i8> <i8 1, i8 1>, %neg
+  ret <2 x i8> %div
+}