From 3dbb504081c24a8cac35c4ac230a1c03a6a090e0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 21 Jul 2004 21:28:26 +0000 Subject: [PATCH] Fix cases where we generated horrible code like this: mov %EDI, 12 add %EDI, %ECX mov %ECX, 12 add %ECX, %EDX mov %EDX, 12 add %EDX, %ESI instead (really!) generate this: add %ECX, 12 add %EDX, 12 add %ESI, 12 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15090 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/InstSelectSimple.cpp | 8 +++++++- lib/Target/X86/X86ISelSimple.cpp | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index cb57c12889b..4b43896d37d 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -2967,8 +2967,9 @@ void ISel::visitLoadInst(LoadInst &I) { // Okay, we found a user. If the load is the first operand and there is // no second operand load, reverse the operand ordering. Note that this // can fail for a subtract (ie, no change will be made). + bool Swapped = false; if (!isa(User->getOperand(1))) - cast(User)->swapOperands(); + Swapped = !cast(User)->swapOperands(); // Okay, now that everything is set up, if this load is used by the second // operand, and if there are no instructions that invalidate the load @@ -2985,6 +2986,11 @@ void ISel::visitLoadInst(LoadInst &I) { User->getOpcode() == Instruction::Div) && isSafeToFoldLoadIntoInstruction(I, *User)) return; // Eliminate the load! + + // If we swapped the operands to the instruction, but couldn't fold the + // load anyway, swap them back. We don't want to break add X, int + // folding. + if (Swapped) cast(User)->swapOperands(); } } diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index cb57c12889b..4b43896d37d 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -2967,8 +2967,9 @@ void ISel::visitLoadInst(LoadInst &I) { // Okay, we found a user. If the load is the first operand and there is // no second operand load, reverse the operand ordering. Note that this // can fail for a subtract (ie, no change will be made). + bool Swapped = false; if (!isa(User->getOperand(1))) - cast(User)->swapOperands(); + Swapped = !cast(User)->swapOperands(); // Okay, now that everything is set up, if this load is used by the second // operand, and if there are no instructions that invalidate the load @@ -2985,6 +2986,11 @@ void ISel::visitLoadInst(LoadInst &I) { User->getOpcode() == Instruction::Div) && isSafeToFoldLoadIntoInstruction(I, *User)) return; // Eliminate the load! + + // If we swapped the operands to the instruction, but couldn't fold the + // load anyway, swap them back. We don't want to break add X, int + // folding. + if (Swapped) cast(User)->swapOperands(); } } -- 2.34.1