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; + } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits