[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Jan 9 18:03:17 PST 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAG.cpp updated: 1.22 -> 1.23
---
Log message:

Implement a couple of more simplifications.  This lets us codegen:

int test2(int * P, int* Q, int A, int B) {
        return P+A == P;
}

into:

test2:
        movl 4(%esp), %eax
        movl 12(%esp), %eax
        shll $2, %eax
        cmpl $0, %eax
        sete %al
        movzbl %al, %eax
        ret

instead of:

test2:
        movl 4(%esp), %eax
        movl 12(%esp), %ecx
        leal (%eax,%ecx,4), %ecx
        cmpl %eax, %ecx
        sete %al
        movzbl %al, %eax
        ret

ICC is producing worse code:

test2:
        movl      4(%esp), %eax                                 #8.5
        movl      12(%esp), %edx                                #8.5
        lea       (%edx,%edx), %ecx                             #9.9
        addl      %ecx, %ecx                                    #9.9
        addl      %eax, %ecx                                    #9.9
        cmpl      %eax, %ecx                                    #9.16
        movl      $0, %eax                                      #9.16
        sete      %al                                           #9.16
        ret                                                     #9.16

as is GCC (looks like our old code):

test2:
        movl    4(%esp), %edx
        movl    12(%esp), %eax
        leal    (%edx,%eax,4), %ecx
        cmpl    %edx, %ecx
        sete    %al
        movzbl  %al, %eax
        ret



---
Diffs of the changes:  (+43 -12)

Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.22 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.23
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.22	Sun Jan  9 19:16:03 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp	Sun Jan  9 20:03:02 2005
@@ -398,23 +398,54 @@
     Cond = UOF == 0 ? ISD::SETUO : ISD::SETO;
   }
 
-  // Simplify (X+Y) == (X+Z) -->  Y == Z
   if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
-      N1.getOpcode() == N2.getOpcode() && MVT::isInteger(N1.getValueType()))
-    if (N1.getOpcode() == ISD::ADD || N1.getOpcode() == ISD::SUB) {
-      if (N1.getOperand(0) == N2.getOperand(0))
-        return getSetCC(Cond, N1.getOperand(1), N2.getOperand(1));
-      if (N1.getOperand(1) == N2.getOperand(1))
-        return getSetCC(Cond, N1.getOperand(0), N2.getOperand(0));
-      if (isCommutativeBinOp(N1.getOpcode())) {
-        // If X op Y == Y op X, try other combinations.
-        if (N1.getOperand(0) == N2.getOperand(1))
-          return getSetCC(Cond, N1.getOperand(1), N2.getOperand(0));
-        if (N1.getOperand(1) == N2.getOperand(0))
+      MVT::isInteger(N1.getValueType())) {
+    if (N1.getOpcode() == ISD::ADD || N1.getOpcode() == ISD::SUB ||
+        N1.getOpcode() == ISD::XOR) {
+      // Simplify (X+Y) == (X+Z) -->  Y == Z
+      if (N1.getOpcode() == N2.getOpcode()) {
+        if (N1.getOperand(0) == N2.getOperand(0))
           return getSetCC(Cond, N1.getOperand(1), N2.getOperand(1));
+        if (N1.getOperand(1) == N2.getOperand(1))
+          return getSetCC(Cond, N1.getOperand(0), N2.getOperand(0));
+        if (isCommutativeBinOp(N1.getOpcode())) {
+          // If X op Y == Y op X, try other combinations.
+          if (N1.getOperand(0) == N2.getOperand(1))
+            return getSetCC(Cond, N1.getOperand(1), N2.getOperand(0));
+          if (N1.getOperand(1) == N2.getOperand(0))
+            return getSetCC(Cond, N1.getOperand(1), N2.getOperand(1));
+        }
+      }
+      
+      // Simplify (X+Z) == X -->  Z == 0
+      if (N1.getOperand(0) == N2)
+        return getSetCC(Cond, N1.getOperand(1),
+                        getConstant(0, N1.getValueType()));
+      if (N1.getOperand(1) == N2) {
+        if (isCommutativeBinOp(N1.getOpcode()))
+          return getSetCC(Cond, N1.getOperand(0),
+                          getConstant(0, N1.getValueType()));
+        else {
+          assert(N1.getOpcode() == ISD::SUB && "Unexpected operation!");
+          // (Z-X) == X  --> Z == X<<1
+          return getSetCC(Cond, N1.getOperand(0),
+                          getNode(ISD::SHL, N2.getValueType(), 
+                                  N2, getConstant(1, MVT::i8)));
+        }
       }
     }
 
+    if (N2.getOpcode() == ISD::ADD || N2.getOpcode() == ISD::SUB ||
+        N2.getOpcode() == ISD::XOR) {
+      // Simplify  X == (X+Z) -->  Z == 0
+      if (N2.getOperand(0) == N1)
+        return getSetCC(Cond, N2.getOperand(1),
+                        getConstant(0, N2.getValueType()));
+      else if (N2.getOperand(1) == N1)
+        return getSetCC(Cond, N2.getOperand(0),
+                        getConstant(0, N2.getValueType()));
+    }
+  }
 
   SetCCSDNode *&N = SetCCs[std::make_pair(std::make_pair(N1, N2), Cond)];
   if (N) return SDOperand(N, 0);






More information about the llvm-commits mailing list