Fix a reassociate crash on sozefx when compiling with dragonegg+gcc-4.7 due to
authorDuncan Sands <baldrick@free.fr>
Fri, 29 Jun 2012 13:25:06 +0000 (13:25 +0000)
committerDuncan Sands <baldrick@free.fr>
Fri, 29 Jun 2012 13:25:06 +0000 (13:25 +0000)
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

lib/Transforms/Scalar/Reassociate.cpp
test/Transforms/Reassociate/crash.ll

index fc7db2e62db6c3d0843ece39f5a885013eb8a174..547a51e7d4e594373c7c07ee02b33b292fe24506 100644 (file)
@@ -674,8 +674,6 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
   // Flags are cleared from the operator in ExpressionChanged up to I inclusive.
   BinaryOperator *ExpressionChanged = 0;
   for (unsigned i = 0; ; ++i) {
-    assert(!NodesToRewrite.empty() &&
-           "Optimized expressions has more nodes than original!");
     BinaryOperator *Op = NodesToRewrite.pop_back_val();
 
     // 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
-    // the left-hand side.
-    assert(!NodesToRewrite.empty() &&
-           "Optimized expressions has more nodes than original!");
+    // the left-hand side.  If there are no nodes left then the optimizers made
+    // an expression with more nodes than the original!  This usually means that
+    // 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');
     Op->setOperand(0, NodesToRewrite.back());
     DEBUG(dbgs() << "TO: " << *Op << '\n');
index a99c844f01a4ec5b4bf139637c9810012d2070e0..ce586e15fbcf05a76574160a7fa6334b783a3f17 100644 (file)
@@ -133,3 +133,14 @@ define i8 @f0(i8 %x) {
   %t7 = mul i8 %t6, %t0
   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
+}