mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-17 21:25:33 +00:00
Fix an overly general check in SimplifyIndvar to handle useless phi cycles.
The right way to check for a binary operation is cast<BinaryOperator>. The original check: cast<Instruction> && numOperands() == 2 would match phi "instructions", leading to an infinite loop in extreme corner case: a useless phi with operands [self, constant] that prior optimization passes failed to remove, being used in the loop by another useless phi, in turn being used by an lshr or udiv. Fixes PR11350: runaway iteration assertion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144935 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -107,8 +107,8 @@ Value *SimplifyIndvar::foldIVUser(Instruction *UseInst, Instruction *IVOperand)
|
||||
|
||||
// Attempt to fold a binary operator with constant operand.
|
||||
// e.g. ((I + 1) >> 2) => I >> 2
|
||||
if (IVOperand->getNumOperands() != 2 ||
|
||||
!isa<ConstantInt>(IVOperand->getOperand(1)))
|
||||
if (!isa<BinaryOperator>(IVOperand)
|
||||
|| !isa<ConstantInt>(IVOperand->getOperand(1)))
|
||||
return 0;
|
||||
|
||||
IVSrc = IVOperand->getOperand(0);
|
||||
|
Reference in New Issue
Block a user