#include "llvm/BasicBlock.h"
#include "llvm/Method.h"
#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/InstrSelection.h"
#include "llvm/Target/MachineInstrInfo.h"
#include "llvm/Target/MachineRegInfo.h"
#include "llvm/Support/StringExtras.h"
void
-SchedGraph::addSSAEdge(SchedGraphNode* node,
- const Value* val,
+SchedGraph::addSSAEdge(SchedGraphNode* destNode,
+ const Instruction* defVMInstr,
+ const Value* defValue,
const TargetMachine& target)
{
- if (!isa<Instruction>(val)) return;
-
- const Instruction* thisVMInstr = node->getInstr();
- const Instruction* defVMInstr = cast<const Instruction>(val);
-
// Phi instructions are the only ones that produce a value but don't get
// any non-dummy machine instructions. Return here as an optimization.
//
if (defOp.opIsDef()
&& (defOp.getOperandType() == MachineOperand::MO_VirtualRegister
|| defOp.getOperandType() == MachineOperand::MO_CCRegister)
- && (defOp.getVRegValue() == val))
+ && (defOp.getVRegValue() == defValue))
{
- CreateSSAEdge(this, defMvec[i], node, val);
+ CreateSSAEdge(this, defMvec[i], destNode, defValue);
edgeAddedForInstr = true;
break;
}
if (! edgeAddedForInstr)
{
for (unsigned o=0, N=defMvec[i]->getNumImplicitRefs(); o < N; ++o)
- if (defMvec[i]->implicitRefIsDefined(o))
+ if (defMvec[i]->implicitRefIsDefined(o) &&
+ defMvec[i]->getImplicitRef(o) == defValue)
{
- CreateSSAEdge(this, defMvec[i], node, val);
+ CreateSSAEdge(this, defMvec[i], destNode, defValue);
edgeAddedForInstr = true;
break;
}
return;
assert(node->getInstr() && "Should be no dummy nodes here!");
- const Instruction& instr = * node->getInstr();
+ const Instruction* instr = node->getInstr();
// Add edges for all operands of the machine instruction.
// Also, record all machine register references to add reg. deps. later.
{
case MachineOperand::MO_VirtualRegister:
case MachineOperand::MO_CCRegister:
- if (mop.getVRegValue())
- addSSAEdge(node, mop.getVRegValue(), target);
+ if (const Instruction* srcI =
+ dyn_cast_or_null<Instruction>(mop.getVRegValue()))
+ {
+ if (srcI->getOpcode() == TMP_INSTRUCTION_OPCODE)
+ srcI = instr;
+ addSSAEdge(node, srcI, mop.getVRegValue(), target);
+ }
break;
case MachineOperand::MO_MachineRegister:
//
for (unsigned i=0, N=minstr.getNumImplicitRefs(); i < N; ++i)
if (! minstr.implicitRefIsDefined(i))
- addSSAEdge(node, minstr.getImplicitRef(i), target);
+ if (const Instruction* srcI =
+ dyn_cast_or_null<Instruction>(minstr.getImplicitRef(i)))
+ {
+ if (srcI->getOpcode() == TMP_INSTRUCTION_OPCODE)
+ srcI = instr;
+ addSSAEdge(node, srcI, minstr.getImplicitRef(i), target);
+ }
}
#include "llvm/BasicBlock.h"
#include "llvm/Method.h"
#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/InstrSelection.h"
#include "llvm/Target/MachineInstrInfo.h"
#include "llvm/Target/MachineRegInfo.h"
#include "llvm/Support/StringExtras.h"
void
-SchedGraph::addSSAEdge(SchedGraphNode* node,
- const Value* val,
+SchedGraph::addSSAEdge(SchedGraphNode* destNode,
+ const Instruction* defVMInstr,
+ const Value* defValue,
const TargetMachine& target)
{
- if (!isa<Instruction>(val)) return;
-
- const Instruction* thisVMInstr = node->getInstr();
- const Instruction* defVMInstr = cast<const Instruction>(val);
-
// Phi instructions are the only ones that produce a value but don't get
// any non-dummy machine instructions. Return here as an optimization.
//
if (defOp.opIsDef()
&& (defOp.getOperandType() == MachineOperand::MO_VirtualRegister
|| defOp.getOperandType() == MachineOperand::MO_CCRegister)
- && (defOp.getVRegValue() == val))
+ && (defOp.getVRegValue() == defValue))
{
- CreateSSAEdge(this, defMvec[i], node, val);
+ CreateSSAEdge(this, defMvec[i], destNode, defValue);
edgeAddedForInstr = true;
break;
}
if (! edgeAddedForInstr)
{
for (unsigned o=0, N=defMvec[i]->getNumImplicitRefs(); o < N; ++o)
- if (defMvec[i]->implicitRefIsDefined(o))
+ if (defMvec[i]->implicitRefIsDefined(o) &&
+ defMvec[i]->getImplicitRef(o) == defValue)
{
- CreateSSAEdge(this, defMvec[i], node, val);
+ CreateSSAEdge(this, defMvec[i], destNode, defValue);
edgeAddedForInstr = true;
break;
}
return;
assert(node->getInstr() && "Should be no dummy nodes here!");
- const Instruction& instr = * node->getInstr();
+ const Instruction* instr = node->getInstr();
// Add edges for all operands of the machine instruction.
// Also, record all machine register references to add reg. deps. later.
{
case MachineOperand::MO_VirtualRegister:
case MachineOperand::MO_CCRegister:
- if (mop.getVRegValue())
- addSSAEdge(node, mop.getVRegValue(), target);
+ if (const Instruction* srcI =
+ dyn_cast_or_null<Instruction>(mop.getVRegValue()))
+ {
+ if (srcI->getOpcode() == TMP_INSTRUCTION_OPCODE)
+ srcI = instr;
+ addSSAEdge(node, srcI, mop.getVRegValue(), target);
+ }
break;
case MachineOperand::MO_MachineRegister:
//
for (unsigned i=0, N=minstr.getNumImplicitRefs(); i < N; ++i)
if (! minstr.implicitRefIsDefined(i))
- addSSAEdge(node, minstr.getImplicitRef(i), target);
+ if (const Instruction* srcI =
+ dyn_cast_or_null<Instruction>(minstr.getImplicitRef(i)))
+ {
+ if (srcI->getOpcode() == TMP_INSTRUCTION_OPCODE)
+ srcI = instr;
+ addSSAEdge(node, srcI, minstr.getImplicitRef(i), target);
+ }
}