summaryrefslogtreecommitdiff
path: root/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2002-07-08 23:30:14 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2002-07-08 23:30:14 +0000
commit6418eac2f14a9163cef29da0293966ca4374f608 (patch)
tree24fae29283e5ae2f02323415d68d7fadd74da7a3 /lib/Target
parent97da3649dd6e607ec76e60156756c00cbaeed508 (diff)
downloadllvm-6418eac2f14a9163cef29da0293966ca4374f608.tar.gz
llvm-6418eac2f14a9163cef29da0293966ca4374f608.tar.bz2
llvm-6418eac2f14a9163cef29da0293966ca4374f608.tar.xz
Have to save a boolean (setCC) value whenever use is outside the current
basic block. Mark setCCInstr used as dest. of conditional-move as both a def and a use. BA instruction no longer has the unused CC argument. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2836 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/SparcV9/SparcV9InstrSelection.cpp36
1 files changed, 16 insertions, 20 deletions
diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
index 4e8259f6d8..ea1ddea881 100644
--- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp
+++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
@@ -1172,7 +1172,8 @@ ForwardOperand(InstructionNode* treeNode,
for (unsigned i=0,numOps=minstr->getNumImplicitRefs(); i<numOps; ++i)
if (minstr->getImplicitRef(i) == unusedOp)
minstr->setImplicitRef(i, fwdOp,
- minstr->implicitRefIsDefined(i));
+ minstr->implicitRefIsDefined(i),
+ minstr->implicitRefIsDefinedAndUsed(i));
}
}
}
@@ -1320,9 +1321,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
case 5: // stmt: BrUncond
M = new MachineInstr(BA);
- M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
- (Value*)NULL);
- M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
+ M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
cast<BranchInst>(subtreeRoot->getInstruction())->getSuccessor(0));
mvec.push_back(M);
@@ -1369,9 +1368,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
// false branch
M = new MachineInstr(BA);
- M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
- (Value*) NULL);
- M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
+ M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
brInst->getSuccessor(1));
mvec.push_back(M);
@@ -1409,9 +1406,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
// false branch
M = new MachineInstr(BA);
- M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
- (Value*) NULL);
- M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
+ M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
brInst->getSuccessor(1));
mvec.push_back(M);
@@ -1428,9 +1423,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
unsigned dest = cast<ConstantBool>(constVal)->getValue()? 0 : 1;
M = new MachineInstr(BA);
- M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
- (Value*) NULL);
- M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
+ M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
cast<BranchInst>(subtreeRoot->getInstruction())->getSuccessor(dest));
mvec.push_back(M);
@@ -1455,9 +1448,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
// false branch
M = new MachineInstr(BA);
- M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
- (Value*) NULL);
- M->SetMachineOperandVal(1, MachineOperand::MO_PCRelativeDisp,
+ M->SetMachineOperandVal(0, MachineOperand::MO_PCRelativeDisp,
cast<BranchInst>(subtreeRoot->getInstruction())->getSuccessor(1));
mvec.push_back(M);
@@ -1858,7 +1849,8 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
// a result register, and setting a condition code.
//
// If the boolean result of the SetCC is used by anything other
- // than a branch instruction, the boolean must be
+ // than a branch instruction, or if it is used outside the current
+ // basic block, the boolean must be
// computed and stored in the result register. Otherwise, discard
// the difference (by using %g0) and keep only the condition code.
//
@@ -1870,7 +1862,8 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
InstructionNode* parentNode = (InstructionNode*) subtreeRoot->parent();
Instruction* setCCInstr = subtreeRoot->getInstruction();
- bool keepBoolVal = ! AllUsesAreBranches(setCCInstr);
+ bool keepBoolVal = parentNode == NULL ||
+ ! AllUsesAreBranches(setCCInstr);
bool subValIsBoolVal = setCCInstr->getOpcode() == Instruction::SetNE;
bool keepSubVal = keepBoolVal && subValIsBoolVal;
bool computeBoolVal = keepBoolVal && ! subValIsBoolVal;
@@ -1878,7 +1871,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
bool mustClearReg;
int valueToMove;
MachineOpCode movOpCode = 0;
-
+
// Mark the 4th operand as being a CC register, and as a def
// A TmpInstruction is created to represent the CC "result".
// Unlike other instances of TmpInstruction, this one is used
@@ -1950,13 +1943,16 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
}
// Now conditionally move `valueToMove' (0 or 1) into the register
+ // Mark the register as a use (as well as a def) because the old
+ // value should be retained if the condition is false.
M = new MachineInstr(movOpCode);
M->SetMachineOperandVal(0, MachineOperand::MO_CCRegister,
tmpForCC);
M->SetMachineOperandConst(1, MachineOperand::MO_UnextendedImmed,
valueToMove);
M->SetMachineOperandVal(2, MachineOperand::MO_VirtualRegister,
- setCCInstr);
+ setCCInstr, /*isDef*/ true,
+ /*isDefAndUse*/ true);
mvec.push_back(M);
}
break;