mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
resolve fixme: we now infer the instruction-level 'isvariadic' bit
from the pattern if present, and we use it instead of the bit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98938 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
60e9eac357
commit
1e50631675
@ -1957,10 +1957,12 @@ class InstAnalyzer {
|
||||
bool &mayStore;
|
||||
bool &mayLoad;
|
||||
bool &HasSideEffects;
|
||||
bool &IsVariadic;
|
||||
public:
|
||||
InstAnalyzer(const CodeGenDAGPatterns &cdp,
|
||||
bool &maystore, bool &mayload, bool &hse)
|
||||
: CDP(cdp), mayStore(maystore), mayLoad(mayload), HasSideEffects(hse){
|
||||
bool &maystore, bool &mayload, bool &hse, bool &isv)
|
||||
: CDP(cdp), mayStore(maystore), mayLoad(mayload), HasSideEffects(hse),
|
||||
IsVariadic(isv) {
|
||||
}
|
||||
|
||||
/// Analyze - Analyze the specified instruction, returning true if the
|
||||
@ -2009,6 +2011,7 @@ private:
|
||||
if (OpInfo.hasProperty(SDNPMayStore)) mayStore = true;
|
||||
if (OpInfo.hasProperty(SDNPMayLoad)) mayLoad = true;
|
||||
if (OpInfo.hasProperty(SDNPSideEffect)) HasSideEffects = true;
|
||||
if (OpInfo.hasProperty(SDNPVariadic)) IsVariadic = true;
|
||||
|
||||
if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) {
|
||||
// If this is an intrinsic, analyze it.
|
||||
@ -2028,12 +2031,13 @@ private:
|
||||
|
||||
static void InferFromPattern(const CodeGenInstruction &Inst,
|
||||
bool &MayStore, bool &MayLoad,
|
||||
bool &HasSideEffects,
|
||||
bool &HasSideEffects, bool &IsVariadic,
|
||||
const CodeGenDAGPatterns &CDP) {
|
||||
MayStore = MayLoad = HasSideEffects = false;
|
||||
MayStore = MayLoad = HasSideEffects = IsVariadic = false;
|
||||
|
||||
bool HadPattern =
|
||||
InstAnalyzer(CDP, MayStore, MayLoad, HasSideEffects).Analyze(Inst.TheDef);
|
||||
InstAnalyzer(CDP, MayStore, MayLoad, HasSideEffects, IsVariadic)
|
||||
.Analyze(Inst.TheDef);
|
||||
|
||||
// InstAnalyzer only correctly analyzes mayStore/mayLoad so far.
|
||||
if (Inst.mayStore) { // If the .td file explicitly sets mayStore, use it.
|
||||
@ -2071,6 +2075,9 @@ static void InferFromPattern(const CodeGenInstruction &Inst,
|
||||
"which already inferred this.\n", Inst.TheDef->getName().c_str());
|
||||
HasSideEffects = true;
|
||||
}
|
||||
|
||||
if (Inst.isVariadic)
|
||||
IsVariadic = true; // Can warn if we want.
|
||||
}
|
||||
|
||||
/// ParseInstructions - Parse all of the instructions, inlining and resolving
|
||||
@ -2377,11 +2384,13 @@ void CodeGenDAGPatterns::InferInstructionFlags() {
|
||||
CodeGenInstruction &InstInfo =
|
||||
const_cast<CodeGenInstruction &>(*Instructions[i]);
|
||||
// Determine properties of the instruction from its pattern.
|
||||
bool MayStore, MayLoad, HasSideEffects;
|
||||
InferFromPattern(InstInfo, MayStore, MayLoad, HasSideEffects, *this);
|
||||
bool MayStore, MayLoad, HasSideEffects, IsVariadic;
|
||||
InferFromPattern(InstInfo, MayStore, MayLoad, HasSideEffects, IsVariadic,
|
||||
*this);
|
||||
InstInfo.mayStore = MayStore;
|
||||
InstInfo.mayLoad = MayLoad;
|
||||
InstInfo.hasSideEffects = HasSideEffects;
|
||||
InstInfo.isVariadic = IsVariadic;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -734,12 +734,12 @@ EmitResultInstructionAsOperand(const TreePatternNode *N,
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME2: Instead of using the isVariadic flag on the instruction, we should
|
||||
// have an SDNP that indicates variadicism. The TargetInstrInfo isVariadic
|
||||
// property should be inferred from this when an instruction has a pattern.
|
||||
// If this is the root of the pattern and the pattern we're matching includes
|
||||
// a node that is variadic, mark the generated node as variadic so that it
|
||||
// gets the excess operands from the input DAG.
|
||||
int NumFixedArityOperands = -1;
|
||||
if (N->NodeHasProperty(SDNPVariadic, CGP) ||
|
||||
(isRoot && II.isVariadic))
|
||||
if (isRoot &&
|
||||
(Pattern.getSrcPattern()->NodeHasProperty(SDNPVariadic, CGP)))
|
||||
NumFixedArityOperands = Pattern.getSrcPattern()->getNumChildren();
|
||||
|
||||
// If this is the root node and any of the nodes matched nodes in the input
|
||||
|
Loading…
x
Reference in New Issue
Block a user