[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Aug 30 11:37:59 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelDAGToDAG.cpp updated: 1.60 -> 1.61
---
Log message:

Fix some indentation (first hunks).

Remove code (last hunk) that miscompiled immediate and's, such as
  and uint %tmp.30, 4294958079

into
 
 andi. r8, r8, 56319
 andis. r8, r8, 65535

instead of:

 li r9, -9217
 and r8, r8, r9

The first always generates zero.

This fixes espresso.



---
Diffs of the changes:  (+20 -30)

 PPC32ISelDAGToDAG.cpp |   50 ++++++++++++++++++++------------------------------
 1 files changed, 20 insertions(+), 30 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.60 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.61
--- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.60	Tue Aug 30 12:42:59 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp	Tue Aug 30 13:37:48 2005
@@ -257,34 +257,33 @@
   // Generate Mask value for Target
   if (isIntImmediate(Op0.getOperand(1), Value)) {
     switch(Op0Opc) {
-      case ISD::SHL: TgtMask <<= Value; break;
-      case ISD::SRL: TgtMask >>= Value; break;
-      case ISD::AND: TgtMask &= Value; break;
+    case ISD::SHL: TgtMask <<= Value; break;
+    case ISD::SRL: TgtMask >>= Value; break;
+    case ISD::AND: TgtMask &= Value; break;
     }
   } else {
     return 0;
   }
   
   // Generate Mask value for Insert
-  if (isIntImmediate(Op1.getOperand(1), Value)) {
-    switch(Op1Opc) {
-      case ISD::SHL:
-        SH = Value;
-        InsMask <<= SH;
-        if (Op0Opc == ISD::SRL) IsRotate = true;
-          break;
-      case ISD::SRL:
-        SH = Value;
-        InsMask >>= SH;
-        SH = 32-SH;
-        if (Op0Opc == ISD::SHL) IsRotate = true;
-          break;
-      case ISD::AND:
-        InsMask &= Value;
-        break;
-    }
-  } else {
+  if (!isIntImmediate(Op1.getOperand(1), Value))
     return 0;
+  
+  switch(Op1Opc) {
+  case ISD::SHL:
+    SH = Value;
+    InsMask <<= SH;
+    if (Op0Opc == ISD::SRL) IsRotate = true;
+    break;
+  case ISD::SRL:
+    SH = Value;
+    InsMask >>= SH;
+    SH = 32-SH;
+    if (Op0Opc == ISD::SHL) IsRotate = true;
+    break;
+  case ISD::AND:
+    InsMask &= Value;
+    break;
   }
   
   // If both of the inputs are ANDs and one of them has a logical shift by
@@ -979,15 +978,6 @@
                            getI32Imm(MB), getI32Imm(ME));
       break;
     }
-    // If this is an and with an immediate that isn't a mask, then codegen it as
-    // high and low 16 bit immediate ands.
-    if (SDNode *I = SelectIntImmediateExpr(N->getOperand(0), 
-                                           N->getOperand(1),
-                                           PPC::ANDISo, PPC::ANDIo)) {
-      CurDAG->ReplaceAllUsesWith(Op, SDOperand(I, 0));
-      N = I;
-      break;
-    }
     // Finally, check for the case where we are being asked to select
     // and (not(a), b) or and (a, not(b)) which can be selected as andc.
     if (isOprNot(N->getOperand(0).Val))






More information about the llvm-commits mailing list