[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelPattern.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Jan 11 17:28:15 PST 2005



Changes in directory llvm/lib/Target/X86:

X86ISelPattern.cpp updated: 1.37 -> 1.38
---
Log message:

Fold some more [mem] op= val  operators.  This allows us to things like this
several times in 256.bzip2:

        mov %EAX, DWORD PTR [%ESP + 204]
-       mov %EAX, DWORD PTR [%EAX]
-       or %EAX, 2097152
-       mov %ECX, DWORD PTR [%ESP + 204]
-       mov DWORD PTR [%ECX], %EAX
+       or DWORD PTR [%EAX], 2097152



---
Diffs of the changes:  (+39 -2)

Index: llvm/lib/Target/X86/X86ISelPattern.cpp
diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.37 llvm/lib/Target/X86/X86ISelPattern.cpp:1.38
--- llvm/lib/Target/X86/X86ISelPattern.cpp:1.37	Tue Jan 11 17:33:00 2005
+++ llvm/lib/Target/X86/X86ISelPattern.cpp	Tue Jan 11 19:28:00 2005
@@ -2129,11 +2129,46 @@
             X86::ADD8mi, X86::ADD16mi, X86::ADD32mi,
             X86::ADD8mr, X86::ADD16mr, X86::ADD32mr, 0, 0,
           };
+          static const unsigned SUBTAB[] = {
+            X86::SUB8mi, X86::SUB16mi, X86::SUB32mi,
+            X86::SUB8mr, X86::SUB16mr, X86::SUB32mr, 0, 0,
+          };
+          static const unsigned ANDTAB[] = {
+            X86::AND8mi, X86::AND16mi, X86::AND32mi,
+            X86::AND8mr, X86::AND16mr, X86::AND32mr, 0, 0,
+          };
+          static const unsigned ORTAB[] = {
+            X86::OR8mi, X86::OR16mi, X86::OR32mi,
+            X86::OR8mr, X86::OR16mr, X86::OR32mr, 0, 0,
+          };
+          static const unsigned XORTAB[] = {
+            X86::XOR8mi, X86::XOR16mi, X86::XOR32mi,
+            X86::XOR8mr, X86::XOR16mr, X86::XOR32mr, 0, 0,
+          };
+          static const unsigned SHLTAB[] = {
+            X86::SHL8mi, X86::SHL16mi, X86::SHL32mi,
+            /*Have to put the reg in CL*/0, 0, 0, 0, 0,
+          };
+          static const unsigned SARTAB[] = {
+            X86::SAR8mi, X86::SAR16mi, X86::SAR32mi,
+            /*Have to put the reg in CL*/0, 0, 0, 0, 0,
+          };
+          static const unsigned SHRTAB[] = {
+            X86::SHR8mi, X86::SHR16mi, X86::SHR32mi,
+            /*Have to put the reg in CL*/0, 0, 0, 0, 0,
+          };
 
           const unsigned *TabPtr = 0;
           switch (Op.getOpcode()) {
-          default: break;
+          default: std::cerr << "CANNOT [mem] op= val: "; Op.Val->dump(); std::cerr << "\n"; break;
           case ISD::ADD: TabPtr = ADDTAB; break;
+          case ISD::SUB: TabPtr = SUBTAB; break;
+          case ISD::AND: TabPtr = ANDTAB; break;
+          case ISD:: OR: TabPtr =  ORTAB; break;
+          case ISD::XOR: TabPtr = XORTAB; break;
+          case ISD::SHL: TabPtr = SHLTAB; break;
+          case ISD::SRA: TabPtr = SARTAB; break;
+          case ISD::SRL: TabPtr = SHRTAB; break;
           }
           
           if (TabPtr) {
@@ -2166,7 +2201,9 @@
             
             // If we have [mem] = V op [mem], try to turn it into:
             // [mem] = [mem] op V.
-            if (Op1 == TheLoad && 1 /*iscommutative*/)
+            if (Op1 == TheLoad && Op.getOpcode() != ISD::SUB &&
+                Op.getOpcode() != ISD::SHL && Op.getOpcode() != ISD::SRA &&
+                Op.getOpcode() != ISD::SRL)
               std::swap(Op0, Op1);
 
             if (Op0 == TheLoad) {






More information about the llvm-commits mailing list