mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 07:34:06 +00:00
Infer instruction properties from single-instruction patterns.
Previously, instructions without a primary patterns wouldn't get their properties inferred. Now, we use all single-instruction patterns for inference, including 'def : Pat<>' instances. This causes a lot of instruction flags to change. - Many instructions no longer have the UnmodeledSideEffects flag because their flags are now inferred from a pattern. - Instructions with intrinsics will get a mayStore flag if they already have UnmodeledSideEffects and a mayLoad flag if they already have mayStore. This is because intrinsics properties are linear. - Instructions with atomic_load patterns get a mayStore flag because atomic loads can't be reordered. The correct workaround is to create pseudo-instructions instead of using normal loads. PR13693. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162614 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7778ee1ed9
commit
4ad27eda29
@ -1,4 +1,7 @@
|
||||
; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
|
||||
; XFAIL: *
|
||||
; This is xfailed into we have atomic load pseudos. PR13693.
|
||||
|
||||
; Check that we generate new value jump.
|
||||
|
||||
@i = global i32 0, align 4
|
||||
|
@ -1,4 +1,7 @@
|
||||
; RUN: llc -march=hexagon -mcpu=hexagonv4 < %s | FileCheck %s
|
||||
; XFAIL: *
|
||||
; This is xfailed into we have atomic load pseudos. PR13693.
|
||||
|
||||
; Check that we generate new value store packet in V4
|
||||
|
||||
@i = global i32 0, align 4
|
||||
|
@ -2383,6 +2383,10 @@ public:
|
||||
AnalyzeNode(Pat->getTree(0));
|
||||
}
|
||||
|
||||
void Analyze(const PatternToMatch *Pat) {
|
||||
AnalyzeNode(Pat->getSrcPattern());
|
||||
}
|
||||
|
||||
private:
|
||||
bool IsNodeBitcast(const TreePatternNode *N) const {
|
||||
if (hasSideEffects || mayLoad || mayStore || isVariadic)
|
||||
@ -2542,6 +2546,17 @@ static bool hasNullFragReference(ListInit *LI) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Get all the instructions in a tree.
|
||||
static void
|
||||
getInstructionsInTree(TreePatternNode *Tree, SmallVectorImpl<Record*> &Instrs) {
|
||||
if (Tree->isLeaf())
|
||||
return;
|
||||
if (Tree->getOperator()->isSubClassOf("Instruction"))
|
||||
Instrs.push_back(Tree->getOperator());
|
||||
for (unsigned i = 0, e = Tree->getNumChildren(); i != e; ++i)
|
||||
getInstructionsInTree(Tree->getChild(i), Instrs);
|
||||
}
|
||||
|
||||
/// ParseInstructions - Parse all of the instructions, inlining and resolving
|
||||
/// any fragments involved. This populates the Instructions list with fully
|
||||
/// resolved instructions.
|
||||
@ -2870,6 +2885,30 @@ void CodeGenDAGPatterns::InferInstructionFlags() {
|
||||
Errors += InferFromPattern(InstInfo, PatInfo, InstInfo.TheDef);
|
||||
}
|
||||
|
||||
// Second, look for single-instruction patterns defined outside the
|
||||
// instruction.
|
||||
for (ptm_iterator I = ptm_begin(), E = ptm_end(); I != E; ++I) {
|
||||
const PatternToMatch &PTM = *I;
|
||||
|
||||
// We can only infer from single-instruction patterns, otherwise we won't
|
||||
// know which instruction should get the flags.
|
||||
SmallVector<Record*, 8> PatInstrs;
|
||||
getInstructionsInTree(PTM.getDstPattern(), PatInstrs);
|
||||
if (PatInstrs.size() != 1)
|
||||
continue;
|
||||
|
||||
// Get the single instruction.
|
||||
CodeGenInstruction &InstInfo = Target.getInstruction(PatInstrs.front());
|
||||
|
||||
// Only infer properties from the first pattern. We'll verify the others.
|
||||
if (InstInfo.InferredFrom)
|
||||
continue;
|
||||
|
||||
InstAnalyzer PatInfo(*this);
|
||||
PatInfo.Analyze(&PTM);
|
||||
Errors += InferFromPattern(InstInfo, PatInfo, PTM.getSrcRecord());
|
||||
}
|
||||
|
||||
if (Errors)
|
||||
throw "pattern conflicts";
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user