summaryrefslogtreecommitdiff
path: root/lib/Target/X86/PeepholeOptimizer.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-01-13 01:01:59 +0000
committerChris Lattner <sabre@nondot.org>2003-01-13 01:01:59 +0000
commita960d95253be892d5f2e3017ba5df989c247a0c1 (patch)
treebe040e64711b6ffd1b72abf5666fbabdfd9880f3 /lib/Target/X86/PeepholeOptimizer.cpp
parentdb00065fc8ab9fe8b7ac87640c57fd61e922c0f2 (diff)
downloadllvm-a960d95253be892d5f2e3017ba5df989c247a0c1.tar.gz
llvm-a960d95253be892d5f2e3017ba5df989c247a0c1.tar.bz2
llvm-a960d95253be892d5f2e3017ba5df989c247a0c1.tar.xz
New files
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5260 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/PeepholeOptimizer.cpp')
-rw-r--r--lib/Target/X86/PeepholeOptimizer.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/Target/X86/PeepholeOptimizer.cpp b/lib/Target/X86/PeepholeOptimizer.cpp
new file mode 100644
index 0000000000..95828191fb
--- /dev/null
+++ b/lib/Target/X86/PeepholeOptimizer.cpp
@@ -0,0 +1,86 @@
+//===-- PeepholeOptimizer.cpp - X86 Peephole Optimizer --------------------===//
+//
+// This file contains a peephole optimizer for the X86.
+//
+//===----------------------------------------------------------------------===//
+
+#include "X86.h"
+#include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachineInstrBuilder.h"
+
+namespace {
+ struct PH : public MachineFunctionPass {
+ virtual bool runOnMachineFunction(MachineFunction &MF);
+
+ bool PeepholeOptimize(MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator &I);
+
+ virtual const char *getPassName() const { return "X86 Peephole Optimizer"; }
+ };
+}
+
+Pass *createX86PeepholeOptimizerPass() { return new PH(); }
+
+bool PH::runOnMachineFunction(MachineFunction &MF) {
+ bool Changed = false;
+
+ for (MachineFunction::iterator BI = MF.begin(), E = MF.end(); BI != E; ++BI)
+ for (MachineBasicBlock::iterator I = BI->begin(), E = BI->end(); I != E; )
+ if (PeepholeOptimize(*BI, I))
+ Changed = true;
+ else
+ ++I;
+
+ return Changed;
+}
+
+
+bool PH::PeepholeOptimize(MachineBasicBlock &MBB,
+ MachineBasicBlock::iterator &I) {
+ MachineInstr *MI = *I;
+ MachineInstr *Next = (I+1 != MBB.end()) ? *(I+1) : 0;
+ unsigned Size = 0;
+ switch (MI->getOpcode()) {
+ case X86::MOVrr8:
+ case X86::MOVrr16:
+ case X86::MOVrr32: // Destroy X = X copies...
+ if (MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) {
+ I = MBB.erase(I);
+ delete MI;
+ return true;
+ }
+ return false;
+
+#if 0
+ case X86::MOVir32: Size++;
+ case X86::MOVir16: Size++;
+ case X86::MOVir8:
+ // FIXME: We can only do this transformation if we know that flags are not
+ // used here, because XOR clobbers the flags!
+ if (MI->getOperand(1).isImmediate()) { // avoid mov EAX, <value>
+ int Val = MI->getOperand(1).getImmedValue();
+ if (Val == 0) { // mov EAX, 0 -> xor EAX, EAX
+ static const unsigned Opcode[] ={X86::XORrr8,X86::XORrr16,X86::XORrr32};
+ unsigned Reg = MI->getOperand(0).getReg();
+ *I = BuildMI(Opcode[Size], 2, Reg).addReg(Reg).addReg(Reg);
+ delete MI;
+ return true;
+ } else if (Val == -1) { // mov EAX, -1 -> or EAX, -1
+ // TODO: 'or Reg, -1' has a smaller encoding than 'mov Reg, -1'
+ }
+ }
+ return false;
+#endif
+ case X86::BSWAPr32: // Change bswap EAX, bswap EAX into nothing
+ if (Next->getOpcode() == X86::BSWAPr32 &&
+ MI->getOperand(0).getReg() == Next->getOperand(0).getReg()) {
+ I = MBB.erase(MBB.erase(I));
+ delete MI;
+ delete Next;
+ return true;
+ }
+ return false;
+ default:
+ return false;
+ }
+}