aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-12-03 23:07:03 +0000
committerDan Gohman <dan433584@gmail.com>2015-12-03 23:07:03 +0000
commit391a98afd54acf7205b726196eb646e2d91963d4 (patch)
tree507b0746141ad48329994cfe0a260ade2f5ce387 /llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp
parent149b859c55d137fef9f68ecb4506c931d12189ac (diff)
downloadllvm-391a98afd54acf7205b726196eb646e2d91963d4.zip
llvm-391a98afd54acf7205b726196eb646e2d91963d4.tar.gz
llvm-391a98afd54acf7205b726196eb646e2d91963d4.tar.bz2
[WebAssembly] Fix dominance check for PHIs in the StoreResult pass
When a block has no terminator instructions, getFirstTerminator() returns end(), which can't be used in dominance checks. Check dominance for phi operands separately. Also, remove some bits from WebAssemblyRegStackify.cpp that were causing trouble on the same testcase; they were left behind from an earlier experiment. Differential Revision: http://reviews.llvm.org/D15210 llvm-svn: 254662
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp9
1 files changed, 4 insertions, 5 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp
index bdccc85..ecbbc5c 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp
@@ -81,6 +81,7 @@ static void ImposeStackOrdering(MachineInstr *MI) {
// more precise.
static bool IsSafeToMove(const MachineInstr *Def, const MachineInstr *Insert,
AliasAnalysis &AA) {
+ assert(Def->getParent() == Insert->getParent());
bool SawStore = false, SawSideEffects = false;
MachineBasicBlock::const_iterator D(Def), I(Insert);
for (--I; I != D; --I)
@@ -155,17 +156,15 @@ bool WebAssemblyRegStackify::runOnMachineFunction(MachineFunction &MF) {
Def->getOpcode() == WebAssembly::ARGUMENT_F64)
continue;
- // Single-use expression trees require defs that have one use, or that
- // they be trivially clonable.
+ // Single-use expression trees require defs that have one use.
// TODO: Eventually we'll relax this, to take advantage of set_local
// returning its result.
if (!MRI.hasOneUse(Reg))
continue;
- // For now, be conservative and don't look across block boundaries,
- // unless we have something trivially clonable.
+ // For now, be conservative and don't look across block boundaries.
// TODO: Be more aggressive.
- if (Def->getParent() != &MBB && !Def->isMoveImmediate())
+ if (Def->getParent() != &MBB)
continue;
// Don't move instructions that have side effects or memory dependencies