mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +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