diff options
-rw-r--r-- | lib/Target/SparcV9/SparcV9AsmPrinter.cpp | 11 | ||||
-rw-r--r-- | lib/Target/SparcV9/SparcV9BurgISel.cpp | 17 | ||||
-rw-r--r-- | lib/Target/SparcV9/SparcV9PreSelection.cpp | 9 |
3 files changed, 29 insertions, 8 deletions
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp index 9aa73ed4f8..1c0d1c000a 100644 --- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp +++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp @@ -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 diff --git a/lib/Target/SparcV9/SparcV9BurgISel.cpp b/lib/Target/SparcV9/SparcV9BurgISel.cpp index 1d4dbbd2bf..55e5f0ee24 100644 --- a/lib/Target/SparcV9/SparcV9BurgISel.cpp +++ b/lib/Target/SparcV9/SparcV9BurgISel.cpp @@ -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 diff --git a/lib/Target/SparcV9/SparcV9PreSelection.cpp b/lib/Target/SparcV9/SparcV9PreSelection.cpp index 6eade42825..fd1fdc329e 100644 --- a/lib/Target/SparcV9/SparcV9PreSelection.cpp +++ b/lib/Target/SparcV9/SparcV9PreSelection.cpp @@ -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]. |