mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 19:25:00 +00:00
Fix a reassociate crash on sozefx when compiling with dragonegg+gcc-4.7 due to
the optimizers producing a multiply expression with more multiplications than the original (!). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159426 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -674,8 +674,6 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
|
|||||||
// Flags are cleared from the operator in ExpressionChanged up to I inclusive.
|
// Flags are cleared from the operator in ExpressionChanged up to I inclusive.
|
||||||
BinaryOperator *ExpressionChanged = 0;
|
BinaryOperator *ExpressionChanged = 0;
|
||||||
for (unsigned i = 0; ; ++i) {
|
for (unsigned i = 0; ; ++i) {
|
||||||
assert(!NodesToRewrite.empty() &&
|
|
||||||
"Optimized expressions has more nodes than original!");
|
|
||||||
BinaryOperator *Op = NodesToRewrite.pop_back_val();
|
BinaryOperator *Op = NodesToRewrite.pop_back_val();
|
||||||
|
|
||||||
// The last operation (which comes earliest in the IR) is special as both
|
// The last operation (which comes earliest in the IR) is special as both
|
||||||
@@ -753,9 +751,19 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, grab a spare node from the original expression and use that as
|
// Otherwise, grab a spare node from the original expression and use that as
|
||||||
// the left-hand side.
|
// the left-hand side. If there are no nodes left then the optimizers made
|
||||||
assert(!NodesToRewrite.empty() &&
|
// an expression with more nodes than the original! This usually means that
|
||||||
"Optimized expressions has more nodes than original!");
|
// they did something stupid but it might mean that the problem was just too
|
||||||
|
// hard (finding the mimimal number of multiplications needed to realize a
|
||||||
|
// multiplication expression is NP-complete). Whatever the reason, smart or
|
||||||
|
// stupid, create a new node if there are none left.
|
||||||
|
if (NodesToRewrite.empty()) {
|
||||||
|
Constant *Undef = UndefValue::get(I->getType());
|
||||||
|
BinaryOperator *N = BinaryOperator::Create(Instruction::BinaryOps(Opcode),
|
||||||
|
Undef, Undef, "", I);
|
||||||
|
NodesToRewrite.push_back(N);
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG(dbgs() << "RA: " << *Op << '\n');
|
DEBUG(dbgs() << "RA: " << *Op << '\n');
|
||||||
Op->setOperand(0, NodesToRewrite.back());
|
Op->setOperand(0, NodesToRewrite.back());
|
||||||
DEBUG(dbgs() << "TO: " << *Op << '\n');
|
DEBUG(dbgs() << "TO: " << *Op << '\n');
|
||||||
|
@@ -133,3 +133,14 @@ define i8 @f0(i8 %x) {
|
|||||||
%t7 = mul i8 %t6, %t0
|
%t7 = mul i8 %t6, %t0
|
||||||
ret i8 %t7
|
ret i8 %t7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i32 @sozefx_(i32 %x, i32 %y) {
|
||||||
|
%t0 = sub i32 %x, %x
|
||||||
|
%t1 = mul i32 %t0, %t0
|
||||||
|
%t2 = mul i32 %x, %t0
|
||||||
|
%t3 = mul i32 %t1, %t1
|
||||||
|
%t4 = add i32 %t2, %t3
|
||||||
|
%t5 = mul i32 %x, %y
|
||||||
|
%t6 = add i32 %t4, %t5
|
||||||
|
ret i32 %t6
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user