mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-25 15:01:07 +00:00
[InstCombine] fix miscompile from multi-use cttz/ctlz transform
PR45762: https://bugs.llvm.org/show_bug.cgi?id=45762
This commit is contained in:
parent
53f4697f7c
commit
ba016a3eaf
@ -883,10 +883,11 @@ static Value *foldSelectCttzCtlz(ICmpInst *ICI, Value *TrueVal, Value *FalseVal,
|
||||
return SelectArg;
|
||||
}
|
||||
|
||||
// If the ValueOnZero is not the bitwidth, we can at least make use of the
|
||||
// fact that the cttz/ctlz result will not be used if the input is zero, so
|
||||
// it's okay to relax it to undef for that case.
|
||||
if (II->hasOneUse() && !match(II->getArgOperand(1), m_One()))
|
||||
// The ValueOnZero is not the bitwidth. But if the cttz/ctlz (and optional
|
||||
// zext/trunc) have one use (ending at the select), the cttz/ctlz result will
|
||||
// not be used if the input is zero. Relax to 'undef_on_zero' for that case.
|
||||
if (II->hasOneUse() && SelectArg->hasOneUse() &&
|
||||
!match(II->getArgOperand(1), m_One()))
|
||||
II->setArgOperand(1, ConstantInt::getTrue(II->getContext()));
|
||||
|
||||
return nullptr;
|
||||
|
@ -220,7 +220,7 @@ define <2 x i32> @select_clz_to_ctz_vec_with_undef(<2 x i32> %a) {
|
||||
|
||||
define i4 @PR45762(i3 %x4) {
|
||||
; CHECK-LABEL: @PR45762(
|
||||
; CHECK-NEXT: [[T4:%.*]] = call i3 @llvm.cttz.i3(i3 [[X4:%.*]], i1 true), !range !2
|
||||
; CHECK-NEXT: [[T4:%.*]] = call i3 @llvm.cttz.i3(i3 [[X4:%.*]], i1 false), !range !2
|
||||
; CHECK-NEXT: [[T7:%.*]] = zext i3 [[T4]] to i4
|
||||
; CHECK-NEXT: [[ONE_HOT_16:%.*]] = shl i4 1, [[T7]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i3 [[X4]], 0
|
||||
|
Loading…
x
Reference in New Issue
Block a user