[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/DataStructure.cpp Local.cpp

Reid Spencer reid at x10sys.com
Sun Nov 26 17:06:26 PST 2006



Changes in directory llvm/lib/Analysis/DataStructure:

DataStructure.cpp updated: 1.250 -> 1.251
Local.cpp updated: 1.160 -> 1.161
---
Log message:

For PR950: http://llvm.org/PR950 :
The long awaited CAST patch. This introduces 12 new instructions into LLVM
to replace the cast instruction. Corresponding changes throughout LLVM are
provided. This passes llvm-test, llvm/test, and SPEC CPUINT2000 with the
exception of 175.vpr which fails only on a slight floating point output
difference.


---
Diffs of the changes:  (+24 -17)

 DataStructure.cpp |    4 ++--
 Local.cpp         |   37 ++++++++++++++++++++++---------------
 2 files changed, 24 insertions(+), 17 deletions(-)


Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.250 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.251
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.250	Fri Nov 17 01:33:59 2006
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp	Sun Nov 26 19:05:09 2006
@@ -410,7 +410,7 @@
 
     const Type *T1 = T1W.getCurrentType();
     const Type *T2 = T2W.getCurrentType();
-    if (T1 != T2 && !T1->isLosslesslyConvertibleTo(T2))
+    if (T1 != T2 && !T1->canLosslesslyBitCastTo(T2))
       return false;
 
     T1W.StepToNextType();
@@ -701,7 +701,7 @@
   // Check to see if we have a compatible, but different type...
   if (NewTySize == SubTypeSize) {
     // Check to see if this type is obviously convertible... int -> uint f.e.
-    if (NewTy->isLosslesslyConvertibleTo(SubType))
+    if (NewTy->canLosslesslyBitCastTo(SubType))
       return false;
 
     // Check to see if we have a pointer & integer mismatch going on here,


Index: llvm/lib/Analysis/DataStructure/Local.cpp
diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.160 llvm/lib/Analysis/DataStructure/Local.cpp:1.161
--- llvm/lib/Analysis/DataStructure/Local.cpp:1.160	Fri Nov 17 01:33:59 2006
+++ llvm/lib/Analysis/DataStructure/Local.cpp	Sun Nov 26 19:05:09 2006
@@ -240,7 +240,7 @@
     N->addGlobal(GV);
   } else if (Constant *C = dyn_cast<Constant>(V)) {
     if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
-      if (CE->getOpcode() == Instruction::Cast) {
+      if (CE->isCast()) {
         if (isa<PointerType>(CE->getOperand(0)->getType()))
           NH = getValueDest(*CE->getOperand(0));
         else
@@ -1091,20 +1091,27 @@
 
 /// Handle casts...
 void GraphBuilder::visitCastInst(CastInst &CI) {
-  if (isPointerType(CI.getType()))
-    if (isPointerType(CI.getOperand(0)->getType())) {
-      DSNodeHandle Ptr = getValueDest(*CI.getOperand(0));
-      if (Ptr.getNode() == 0) return;
-
-      // Cast one pointer to the other, just act like a copy instruction
-      setDestTo(CI, Ptr);
-    } else {
-      // Cast something (floating point, small integer) to a pointer.  We need
-      // to track the fact that the node points to SOMETHING, just something we
-      // don't know about.  Make an "Unknown" node.
-      //
-      setDestTo(CI, createNode()->setUnknownNodeMarker());
-    }
+  // Pointers can only be cast with BitCast so check that the instruction
+  // is a BitConvert. If not, its guaranteed not to involve any pointers so
+  // we don't do anything.
+  switch (CI.getOpcode()) {
+  default: break;
+  case Instruction::BitCast:
+  case Instruction::IntToPtr:
+    if (isPointerType(CI.getType()))
+      if (isPointerType(CI.getOperand(0)->getType())) {
+        DSNodeHandle Ptr = getValueDest(*CI.getOperand(0));
+        if (Ptr.getNode() == 0) return;
+        // Cast one pointer to the other, just act like a copy instruction
+        setDestTo(CI, Ptr);
+      } else {
+        // Cast something (floating point, small integer) to a pointer.  We 
+        // need to track the fact that the node points to SOMETHING, just 
+        // something we don't know about.  Make an "Unknown" node.
+        setDestTo(CI, createNode()->setUnknownNodeMarker());
+      }
+    break;
+  }
 }
 
 






More information about the llvm-commits mailing list