From 5a083b81c4fbe32276f33114a584d7c91291b3d9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 16 Oct 2004 18:14:10 +0000 Subject: [PATCH] Add support for undef and unreachable git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17051 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SparcV9/SparcV9AsmPrinter.cpp | 11 +++++++---- lib/Target/SparcV9/SparcV9BurgISel.cpp | 17 +++++++++++++---- 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 9aa73ed4f8b..1c0d1c000ad 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(CV)) { O << getID(GV) << "\n"; - } else if (isa(CV)) { + } else if (isa(CV) || isa(CV)) { // Null pointer value O << "0\n"; } else if (const ConstantExpr* CE = dyn_cast(CV)) { @@ -482,7 +482,7 @@ std::string AsmPrinter::valToExprString(const Value* V, S += utostr(CI->getValue()); else if (const ConstantFP *CFP = dyn_cast(CV)) S += ftostr(CFP->getValue()); - else if (isa(CV)) + else if (isa(CV) || isa(CV)) S += "0"; else if (const ConstantExpr *CE = dyn_cast(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(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(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 1d4dbbd2bf7..55e5f0ee24d 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(operand)) { if (isa(CPV)) opTreeNode = new VRegNode(operand); - else + else if (isa(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(V)) { + if (isa(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(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(CV)) // can always use %g0 + // can always use %g0 + if (isa(CV) || isa(CV)) return false; if (isa(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(idx) && cast(idx)->isNullValue()) || + isa(idx); } /// FoldGetElemChain - Fold a chain of GetElementPtr instructions containing diff --git a/lib/Target/SparcV9/SparcV9PreSelection.cpp b/lib/Target/SparcV9/SparcV9PreSelection.cpp index 6eade42825a..fd1fdc329e1 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(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]. -- 2.11.0