mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-18 06:38:41 +00:00
InstCombine: Don't assume that m_ZExt matches an Instruction
m_ZExt might bind against a ConstantExpr instead of an Instruction. Assuming this, using cast<Instruction>, results in InstCombine crashing. Instead, introduce ZExtOperator to bridge both Instruction and ConstantExpr ZExts. This fixes PR21445. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221069 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9f15bb31c1
commit
ed297abb0a
@ -358,6 +358,8 @@ class LShrOperator
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ZExtOperator : public ConcreteOperator<Operator, Instruction::ZExt> {};
|
||||||
|
|
||||||
|
|
||||||
class GEPOperator
|
class GEPOperator
|
||||||
: public ConcreteOperator<Operator, Instruction::GetElementPtr> {
|
: public ConcreteOperator<Operator, Instruction::GetElementPtr> {
|
||||||
|
@ -2160,8 +2160,8 @@ static Instruction *ProcessUMulZExtIdiom(ICmpInst &I, Value *MulVal,
|
|||||||
Instruction *MulInstr = cast<Instruction>(MulVal);
|
Instruction *MulInstr = cast<Instruction>(MulVal);
|
||||||
assert(MulInstr->getOpcode() == Instruction::Mul);
|
assert(MulInstr->getOpcode() == Instruction::Mul);
|
||||||
|
|
||||||
Instruction *LHS = cast<Instruction>(MulInstr->getOperand(0)),
|
auto *LHS = cast<ZExtOperator>(MulInstr->getOperand(0)),
|
||||||
*RHS = cast<Instruction>(MulInstr->getOperand(1));
|
*RHS = cast<ZExtOperator>(MulInstr->getOperand(1));
|
||||||
assert(LHS->getOpcode() == Instruction::ZExt);
|
assert(LHS->getOpcode() == Instruction::ZExt);
|
||||||
assert(RHS->getOpcode() == Instruction::ZExt);
|
assert(RHS->getOpcode() == Instruction::ZExt);
|
||||||
Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
|
Value *A = LHS->getOperand(0), *B = RHS->getOperand(0);
|
||||||
|
@ -173,3 +173,16 @@ define <4 x i32> @pr20113(<4 x i16> %a, <4 x i16> %b) {
|
|||||||
%vcgez.i = sext <4 x i1> %tmp to <4 x i32>
|
%vcgez.i = sext <4 x i1> %tmp to <4 x i32>
|
||||||
ret <4 x i32> %vcgez.i
|
ret <4 x i32> %vcgez.i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@pr21445_data = external global i32
|
||||||
|
define i1 @pr21445(i8 %a) {
|
||||||
|
; CHECK-LABEL: @pr21445(
|
||||||
|
; CHECK-NEXT: %[[umul:.*]] = call { i8, i1 } @llvm.umul.with.overflow.i8(i8 %a, i8 ptrtoint (i32* @pr21445_data to i8))
|
||||||
|
; CHECK-NEXT: %[[cmp:.*]] = extractvalue { i8, i1 } %[[umul]], 1
|
||||||
|
; CHECK-NEXT: ret i1 %[[cmp]]
|
||||||
|
%ext = zext i8 %a to i32
|
||||||
|
%mul = mul i32 %ext, zext (i8 ptrtoint (i32* @pr21445_data to i8) to i32)
|
||||||
|
%and = and i32 %mul, 255
|
||||||
|
%cmp = icmp ne i32 %mul, %and
|
||||||
|
ret i1 %cmp
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user