From 77072b3170a72d838112c726dc60b0f452cf5409 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Fri, 20 Nov 2015 00:34:54 +0000 Subject: [PATCH] Split the argument unscheduling loop in the WebAssembly register coloring pass. Turn the logic into "look for an insert point and then move things past the insert point". No functional change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253626 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../WebAssembly/WebAssemblyRegColoring.cpp | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/Target/WebAssembly/WebAssemblyRegColoring.cpp b/lib/Target/WebAssembly/WebAssemblyRegColoring.cpp index 7f27e7cede6..bf21024a731 100644 --- a/lib/Target/WebAssembly/WebAssemblyRegColoring.cpp +++ b/lib/Target/WebAssembly/WebAssemblyRegColoring.cpp @@ -98,20 +98,30 @@ bool WebAssemblyRegColoring::runOnMachineFunction(MachineFunction &MF) { // FIXME: If scheduling has moved an ARGUMENT virtual register, move it back, // and recompute liveness. This is a temporary hack. - bool SawNonArg = false; bool MovedArg = false; MachineBasicBlock &EntryMBB = MF.front(); - for (auto MII = EntryMBB.begin(); MII != EntryMBB.end(); ) { - MachineInstr *MI = &*MII++; + MachineBasicBlock::iterator InsertPt = EntryMBB.end(); + // Look for the first NonArg instruction. + for (auto MII = EntryMBB.begin(), MIE = EntryMBB.end(); MII != MIE; ++MII) { + MachineInstr *MI = MII; + if (MI->getOpcode() != WebAssembly::ARGUMENT_I32 && + MI->getOpcode() != WebAssembly::ARGUMENT_I64 && + MI->getOpcode() != WebAssembly::ARGUMENT_F32 && + MI->getOpcode() != WebAssembly::ARGUMENT_F64) { + InsertPt = MII; + break; + } + } + // Now move any argument instructions later in the block + // to before our first NonArg instruction. + for (auto I = InsertPt, E = EntryMBB.end(); I != E; ++I) { + MachineInstr *MI = I; if (MI->getOpcode() == WebAssembly::ARGUMENT_I32 || MI->getOpcode() == WebAssembly::ARGUMENT_I64 || MI->getOpcode() == WebAssembly::ARGUMENT_F32 || MI->getOpcode() == WebAssembly::ARGUMENT_F64) { - EntryMBB.insert(EntryMBB.begin(), MI->removeFromParent()); - if (SawNonArg) - MovedArg = true; - } else { - SawNonArg = true; + EntryMBB.insert(InsertPt, MI->removeFromParent()); + MovedArg = true; } } if (MovedArg) { -- 2.34.1