mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-05 01:56:16 +00:00
Fix invalid cast in instcombine UMul/ZExt idiom
Fixes https://bugs.llvm.org/show_bug.cgi?id=25454 Do not assume IRBuilder creates Instruction where it can create Value. Do not assume idiom operands are constant, leave generalisation ot the IRBuilder. Differential Revision: https://reviews.llvm.org/D35114 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307554 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b6988767a8
commit
65eefa7f01
@ -3856,17 +3856,18 @@ static Instruction *processUMulZExtIdiom(ICmpInst &I, Value *MulVal,
|
||||
} else if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U)) {
|
||||
assert(BO->getOpcode() == Instruction::And);
|
||||
// Replace (mul & mask) --> zext (mul.with.overflow & short_mask)
|
||||
ConstantInt *CI = cast<ConstantInt>(BO->getOperand(1));
|
||||
APInt ShortMask = CI->getValue().trunc(MulWidth);
|
||||
Value *ShortMask =
|
||||
Builder.CreateTrunc(BO->getOperand(1), Builder.getIntNTy(MulWidth));
|
||||
Value *ShortAnd = Builder.CreateAnd(Mul, ShortMask);
|
||||
Instruction *Zext =
|
||||
cast<Instruction>(Builder.CreateZExt(ShortAnd, BO->getType()));
|
||||
IC.Worklist.Add(Zext);
|
||||
Value *Zext = Builder.CreateZExt(ShortAnd, BO->getType());
|
||||
if (auto *ZextI = dyn_cast<Instruction>(Zext))
|
||||
IC.Worklist.Add(ZextI);
|
||||
IC.replaceInstUsesWith(*BO, Zext);
|
||||
} else {
|
||||
llvm_unreachable("Unexpected Binary operation");
|
||||
}
|
||||
IC.Worklist.Add(cast<Instruction>(U));
|
||||
if (auto *UI = dyn_cast<Instruction>(U))
|
||||
IC.Worklist.Add(UI);
|
||||
}
|
||||
}
|
||||
if (isa<Instruction>(OtherVal))
|
||||
|
29
test/Transforms/InstCombine/2017-07-07-UMul-ZExt.ll
Normal file
29
test/Transforms/InstCombine/2017-07-07-UMul-ZExt.ll
Normal file
@ -0,0 +1,29 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
; CHECK: llvm.umul.with.overflow
|
||||
define i32 @sterix(i32, i8, i64) {
|
||||
entry:
|
||||
%conv = zext i32 %0 to i64
|
||||
%conv1 = sext i8 %1 to i32
|
||||
%mul = mul i32 %conv1, 1945964878
|
||||
%sh_prom = trunc i64 %2 to i32
|
||||
%shr = lshr i32 %mul, %sh_prom
|
||||
%conv2 = zext i32 %shr to i64
|
||||
%mul3 = mul nuw nsw i64 %conv, %conv2
|
||||
%conv6 = and i64 %mul3, 4294967295
|
||||
%tobool = icmp ne i64 %conv6, %mul3
|
||||
br i1 %tobool, label %lor.end, label %lor.rhs
|
||||
|
||||
lor.rhs:
|
||||
%and = and i64 %2, %mul3
|
||||
%conv4 = trunc i64 %and to i32
|
||||
%tobool7 = icmp ne i32 %conv4, 0
|
||||
%lnot = xor i1 %tobool7, true
|
||||
br label %lor.end
|
||||
|
||||
lor.end:
|
||||
%3 = phi i1 [ true, %entry ], [ %lnot, %lor.rhs ]
|
||||
%conv8 = zext i1 %3 to i32
|
||||
ret i32 %conv8
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user