OSDN Git Service

Add support for undef and unreachable
authorChris Lattner <sabre@nondot.org>
Sat, 16 Oct 2004 18:14:10 +0000 (18:14 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 16 Oct 2004 18:14:10 +0000 (18:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17051 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9AsmPrinter.cpp
lib/Target/SparcV9/SparcV9BurgISel.cpp
lib/Target/SparcV9/SparcV9PreSelection.cpp

index 9aa73ed..1c0d1c0 100644 (file)
@@ -315,7 +315,7 @@ void AsmPrinter::printSingleConstantValue(const Constant* CV) {
   
   if (const GlobalValue* GV = dyn_cast<GlobalValue>(CV)) {
     O << getID(GV) << "\n";
-  } else if (isa<ConstantPointerNull>(CV)) {
+  } else if (isa<ConstantPointerNull>(CV) || isa<UndefValue>(CV)) {
     // Null pointer value
     O << "0\n";
   } else if (const ConstantExpr* CE = dyn_cast<ConstantExpr>(CV)) { 
@@ -482,7 +482,7 @@ std::string AsmPrinter::valToExprString(const Value* V,
       S += utostr(CI->getValue());
     else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
       S += ftostr(CFP->getValue());
-    else if (isa<ConstantPointerNull>(CV))
+    else if (isa<ConstantPointerNull>(CV) || isa<UndefValue>(CV))
       S += "0";
     else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV))
       S += ConstantExprToString(CE, target);
@@ -750,7 +750,9 @@ void SparcV9AsmPrinter::printGlobalVariable(const GlobalVariable* GV) {
   if (GV->hasExternalLinkage())
     O << "\t.global\t" << getID(GV) << "\n";
   
-  if (GV->hasInitializer() && ! GV->getInitializer()->isNullValue()) {
+  if (GV->hasInitializer() &&
+      !(GV->getInitializer()->isNullValue() ||
+        isa<UndefValue>(GV->getInitializer()))) {
     printConstant(GV->getInitializer(), getID(GV));
   } else {
     O << "\t.align\t" << TypeToAlignment(GV->getType()->getElementType(),
@@ -769,7 +771,8 @@ void SparcV9AsmPrinter::emitGlobals(const Module &M) {
       assert(GI->hasInitializer());
       if (GI->isConstant())
         enterSection(ReadOnlyData);   // read-only, initialized data
-      else if (GI->getInitializer()->isNullValue())
+      else if (GI->getInitializer()->isNullValue() ||
+               isa<UndefValue>(GI->getInitializer()))
         enterSection(ZeroInitRWData); // read-write zero data
       else
         enterSection(InitRWData);     // read-write non-zero data
index 1d4dbbd..55e5f0e 100644 (file)
@@ -397,9 +397,13 @@ InstructionNode* InstrForest::buildTreeForInstruction(Instruction *instr) {
         } else if (Constant *CPV = dyn_cast<Constant>(operand)) {
           if (isa<GlobalValue>(CPV))
             opTreeNode = new VRegNode(operand);
-          else
+          else if (isa<UndefValue>(CPV)) {
+            opTreeNode = new
+               ConstantNode(Constant::getNullValue(CPV->getType()));
+          } else {
             // Create a leaf node for a constant
             opTreeNode = new ConstantNode(CPV);
+          }
         } else {
           // Create a leaf node for the virtual register
           opTreeNode = new VRegNode(operand);
@@ -541,7 +545,7 @@ uint64_t ConvertConstantToIntType(const TargetMachine &target, const Value *V,
   }
 
   // ConstantPointerNull: it's really just a big, shiny version of zero.
-  if (const ConstantPointerNull *CPN = dyn_cast<ConstantPointerNull>(V)) {
+  if (isa<ConstantPointerNull>(V)) {
     isValidConstant = true;
     return 0;
   }
@@ -565,6 +569,9 @@ uint64_t ConvertConstantToIntType(const TargetMachine &target, const Value *V,
     double fC = CFP->getValue();
     C = (destType->isSigned()? (uint64_t) (int64_t) fC
                              : (uint64_t)           fC);
+  } else if (isa<UndefValue>(V)) {
+    isValidConstant = true;
+    C = 0;
   }
 
   // Now if a valid value was found, convert it to destType.
@@ -839,7 +846,8 @@ bool ConstantMayNotFitInImmedField(const Constant* CV, const Instruction* I) {
   if (I->getOpcode() >= MaxConstantsTable.size()) // user-defined op (or bug!)
     return true;
 
-  if (isa<ConstantPointerNull>(CV))               // can always use %g0
+  // can always use %g0
+  if (isa<ConstantPointerNull>(CV) || isa<UndefValue>(CV))
     return false;
 
   if (isa<SwitchInst>(I)) // Switch instructions will be lowered!
@@ -1561,7 +1569,8 @@ static inline void Add3OperandInstr(unsigned Opcode, InstructionNode* Node,
 /// IsZero - Check for a constant 0.
 ///
 static inline bool IsZero(Value* idx) {
-  return (idx == ConstantSInt::getNullValue(idx->getType()));
+  return (isa<Constant>(idx) && cast<Constant>(idx)->isNullValue()) ||
+         isa<UndefValue>(idx);
 }
 
 /// FoldGetElemChain - Fold a chain of GetElementPtr instructions containing
index 6eade42..fd1fdc3 100644 (file)
@@ -55,6 +55,15 @@ namespace {
     void visitCallInst(CallInst &I);
     void visitPHINode(PHINode &PN);
 
+    void visitBasicBlock(BasicBlock &BB) {
+      if (isa<UnreachableInst>(BB.getTerminator())) {
+        BB.getInstList().pop_back();
+        const Type *RetTy = BB.getParent()->getReturnType();
+        Value *RetVal = RetTy == Type::VoidTy ? 0 : UndefValue::get(RetTy);
+        new ReturnInst(RetVal, &BB);
+      }
+    }
+
     // Helper functions for visiting operands of every instruction
     // 
     // visitOperands() works on every operand in [firstOp, lastOp-1].