[llvm-commits] CVS: llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp SparcV9BurgISel.cpp SparcV9PreSelection.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sat Oct 16 11:14:21 PDT 2004
Changes in directory llvm/lib/Target/SparcV9:
SparcV9AsmPrinter.cpp updated: 1.122 -> 1.123
SparcV9BurgISel.cpp updated: 1.9 -> 1.10
SparcV9PreSelection.cpp updated: 1.40 -> 1.41
---
Log message:
Add support for undef and unreachable
---
Diffs of the changes: (+29 -8)
Index: llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
diff -u llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp:1.122 llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp:1.123
--- llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp:1.122 Fri Sep 10 13:01:45 2004
+++ llvm/lib/Target/SparcV9/SparcV9AsmPrinter.cpp Sat Oct 16 13:14:09 2004
@@ -315,7 +315,7 @@
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 @@
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 @@
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 @@
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: llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp
diff -u llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp:1.9 llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp:1.10
--- llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp:1.9 Wed Sep 1 17:55:36 2004
+++ llvm/lib/Target/SparcV9/SparcV9BurgISel.cpp Sat Oct 16 13:14:10 2004
@@ -397,9 +397,13 @@
} 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 @@
}
// 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 @@
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 @@
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 @@
/// 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: llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp
diff -u llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.40 llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.41
--- llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp:1.40 Wed Aug 4 02:29:40 2004
+++ llvm/lib/Target/SparcV9/SparcV9PreSelection.cpp Sat Oct 16 13:14:10 2004
@@ -55,6 +55,15 @@
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].
More information about the llvm-commits
mailing list