summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanya Lattner <tonic@nondot.org>2005-01-16 02:14:17 +0000
committerTanya Lattner <tonic@nondot.org>2005-01-16 02:14:17 +0000
commit5fd2ef1e43acb9bd4551a5c3d2fa125a26146c90 (patch)
tree12d8affb9384dea300d17a05761c2395374d36fc
parent638559aaa3a30cef596fae20292295cb0a329df1 (diff)
downloadllvm-5fd2ef1e43acb9bd4551a5c3d2fa125a26146c90.tar.gz
llvm-5fd2ef1e43acb9bd4551a5c3d2fa125a26146c90.tar.bz2
llvm-5fd2ef1e43acb9bd4551a5c3d2fa125a26146c90.tar.xz
Fixed a couple of instructions that broke SSA.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19587 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/SparcV9/SparcV9BurgISel.cpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/lib/Target/SparcV9/SparcV9BurgISel.cpp b/lib/Target/SparcV9/SparcV9BurgISel.cpp
index 2cf6a64d64..9c21e4a7a0 100644
--- a/lib/Target/SparcV9/SparcV9BurgISel.cpp
+++ b/lib/Target/SparcV9/SparcV9BurgISel.cpp
@@ -706,13 +706,16 @@ CreateSETUWLabel(Value* val,
Instruction* dest, std::vector<MachineInstr*>& mvec) {
MachineInstr* MI;
+ MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get((Instruction*) val);
+ TmpInstruction* tmpReg = new TmpInstruction(mcfi, val);
+
// Set the high 22 bits in dest
- MI = BuildMI(V9::SETHI, 2).addReg(val).addRegDef(dest);
+ MI = BuildMI(V9::SETHI, 2).addReg(val).addRegDef(tmpReg);
MI->getOperand(0).markHi32();
mvec.push_back(MI);
// Set the low 10 bits in dest
- MI = BuildMI(V9::ORr, 3).addReg(dest).addReg(val).addRegDef(dest);
+ MI = BuildMI(V9::ORr, 3).addReg(tmpReg).addReg(val).addRegDef(dest);
MI->getOperand(1).markLo32();
mvec.push_back(MI);
}
@@ -722,7 +725,8 @@ CreateSETUWLabel(Value* val,
///
static inline void
CreateSETXLabel(Value* val, Instruction* tmpReg,
- Instruction* dest, std::vector<MachineInstr*>& mvec) {
+ Instruction* dest, std::vector<MachineInstr*>& mvec,
+ MachineCodeForInstruction& mcfi) {
assert(isa<Constant>(val) &&
"I only know about constant values and global addresses");
@@ -732,20 +736,33 @@ CreateSETXLabel(Value* val, Instruction* tmpReg,
MI->getOperand(0).markHi64();
mvec.push_back(MI);
- MI = BuildMI(V9::ORi, 3).addReg(tmpReg).addPCDisp(val).addRegDef(tmpReg);
+ TmpInstruction* tmpReg2 =
+ new TmpInstruction(mcfi, PointerType::get(val->getType()), val);
+
+ MI = BuildMI(V9::ORi, 3).addReg(tmpReg).addPCDisp(val).addRegDef(tmpReg2);
MI->getOperand(1).markLo64();
mvec.push_back(MI);
- mvec.push_back(BuildMI(V9::SLLXi6, 3).addReg(tmpReg).addZImm(32)
- .addRegDef(tmpReg));
- MI = BuildMI(V9::SETHI, 2).addPCDisp(val).addRegDef(dest);
+
+ TmpInstruction* tmpReg3 =
+ new TmpInstruction(mcfi, PointerType::get(val->getType()), val);
+
+ mvec.push_back(BuildMI(V9::SLLXi6, 3).addReg(tmpReg2).addZImm(32)
+ .addRegDef(tmpReg3));
+
+
+ TmpInstruction* tmpReg4 =
+ new TmpInstruction(mcfi, PointerType::get(val->getType()), val);
+ MI = BuildMI(V9::SETHI, 2).addPCDisp(val).addRegDef(tmpReg4);
MI->getOperand(0).markHi32();
mvec.push_back(MI);
- MI = BuildMI(V9::ORr, 3).addReg(dest).addReg(tmpReg).addRegDef(dest);
+ TmpInstruction* tmpReg5 =
+ new TmpInstruction(mcfi, PointerType::get(val->getType()), val);
+ MI = BuildMI(V9::ORr, 3).addReg(tmpReg4).addReg(tmpReg3).addRegDef(tmpReg5);
mvec.push_back(MI);
- MI = BuildMI(V9::ORi, 3).addReg(dest).addPCDisp(val).addRegDef(dest);
+ MI = BuildMI(V9::ORi, 3).addReg(tmpReg5).addPCDisp(val).addRegDef(dest);
MI->getOperand(1).markLo32();
mvec.push_back(MI);
}
@@ -1075,7 +1092,7 @@ void CreateCodeToLoadConst(const TargetMachine& target, Function* F,
if (isa<GlobalValue>(val)) {
TmpInstruction* tmpReg =
new TmpInstruction(mcfi, PointerType::get(val->getType()), val);
- CreateSETXLabel(val, tmpReg, dest, mvec);
+ CreateSETXLabel(val, tmpReg, dest, mvec, mcfi);
return;
}
@@ -3151,6 +3168,12 @@ void GetInstructionsByRule(InstructionNode* subtreeRoot, int ruleForNode,
{
Instruction* castI = subtreeRoot->getInstruction();
Value* opVal = subtreeRoot->leftChild()->getValue();
+ MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(castI);
+ TmpInstruction* tempReg =
+ new TmpInstruction(mcfi, opVal);
+
+
+
assert(opVal->getType()->isIntegral() ||
isa<PointerType>(opVal->getType()));