forked from OSchip/llvm-project
[InstCombine] Fix a vector splat handling bug in transformZExtICmp.
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. llvm-svn: 314971
This commit is contained in:
parent
902eef32eb
commit
17b0c78447
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue