From a5b8ea0d66c2316275e51a50a5a4341c1a990868 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Mon, 1 Feb 2016 10:46:16 +0000 Subject: [PATCH] WebAssembly NFC: simplify control flow This should now be easier to read. llvm-svn: 259349 --- .../Target/WebAssembly/WebAssemblyStoreResults.cpp | 106 ++++++++++++--------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp index 4035eae..fb2ac98 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp @@ -104,6 +104,63 @@ static bool ReplaceDominatedUses(MachineBasicBlock &MBB, MachineInstr &MI, return Changed; } +static bool optimizeStore(MachineBasicBlock &MBB, MachineInstr &MI, + const MachineRegisterInfo &MRI, + MachineDominatorTree &MDT) { + const auto &Stored = MI.getOperand(WebAssembly::StoreValueOperandNo); + switch (Stored.getType()) { + case MachineOperand::MO_Register: { + unsigned ToReg = MI.getOperand(0).getReg(); + unsigned FromReg = Stored.getReg(); + return ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT); + } + case MachineOperand::MO_FrameIndex: + // TODO: optimize. + return false; + default: + report_fatal_error("Store results: store not consuming reg or frame index"); + } +} + +static bool optimizeCall(MachineBasicBlock &MBB, MachineInstr &MI, + const MachineRegisterInfo &MRI, + MachineDominatorTree &MDT, + const WebAssemblyTargetLowering &TLI, + const TargetLibraryInfo &LibInfo) { + MachineOperand &Op1 = MI.getOperand(1); + if (!Op1.isSymbol()) + return false; + + StringRef Name(Op1.getSymbolName()); + bool callReturnsInput = Name == TLI.getLibcallName(RTLIB::MEMCPY) || + Name == TLI.getLibcallName(RTLIB::MEMMOVE) || + Name == TLI.getLibcallName(RTLIB::MEMSET); + if (!callReturnsInput) + return false; + + LibFunc::Func Func; + if (!LibInfo.getLibFunc(Name, Func)) + return false; + + const auto &Op2 = MI.getOperand(2); + switch (Op2.getType()) { + case MachineOperand::MO_Register: { + unsigned FromReg = Op2.getReg(); + unsigned ToReg = MI.getOperand(0).getReg(); + if (MRI.getRegClass(FromReg) != MRI.getRegClass(ToReg)) + report_fatal_error("Store results: call to builtin function with wrong " + "signature, from/to mismatch"); + return ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT); + } + case MachineOperand::MO_FrameIndex: + // TODO: optimize. + return false; + default: + report_fatal_error("Store results: call to builtin function with wrong " + "signature, not consuming reg or frame index"); + } +} + bool WebAssemblyStoreResults::runOnMachineFunction(MachineFunction &MF) { DEBUG({ dbgs() << "********** Store Results **********\n" @@ -114,7 +171,7 @@ bool WebAssemblyStoreResults::runOnMachineFunction(MachineFunction &MF) { MachineDominatorTree &MDT = getAnalysis(); const WebAssemblyTargetLowering &TLI = *MF.getSubtarget().getTargetLowering(); - auto &LibInfo = getAnalysis().getTLI(); + const auto &LibInfo = getAnalysis().getTLI(); bool Changed = false; assert(MRI.isSSA() && "StoreResults depends on SSA form"); @@ -133,50 +190,13 @@ bool WebAssemblyStoreResults::runOnMachineFunction(MachineFunction &MF) { case WebAssembly::STORE_F32: case WebAssembly::STORE_F64: case WebAssembly::STORE_I32: - case WebAssembly::STORE_I64: { - const auto &Stored = MI.getOperand(WebAssembly::StoreValueOperandNo); - if (Stored.isReg()) { - unsigned ToReg = MI.getOperand(0).getReg(); - unsigned FromReg = Stored.getReg(); - Changed |= ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT); - } else if (Stored.isFI()) { - break; - } else { - report_fatal_error( - "Store results: store not consuming reg or frame index"); - } + case WebAssembly::STORE_I64: + Changed |= optimizeStore(MBB, MI, MRI, MDT); break; - } case WebAssembly::CALL_I32: - case WebAssembly::CALL_I64: { - MachineOperand &Op1 = MI.getOperand(1); - if (Op1.isSymbol()) { - StringRef Name(Op1.getSymbolName()); - if (Name == TLI.getLibcallName(RTLIB::MEMCPY) || - Name == TLI.getLibcallName(RTLIB::MEMMOVE) || - Name == TLI.getLibcallName(RTLIB::MEMSET)) { - LibFunc::Func Func; - if (LibInfo.getLibFunc(Name, Func)) { - const auto &Op2 = MI.getOperand(2); - if (Op2.isReg()) { - unsigned FromReg = Op2.getReg(); - unsigned ToReg = MI.getOperand(0).getReg(); - if (MRI.getRegClass(FromReg) != MRI.getRegClass(ToReg)) - report_fatal_error("Store results: call to builtin function " - "with wrong signature, from/to mismatch"); - Changed |= - ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT); - } else if (Op2.isFI()) { - break; - } else { - report_fatal_error("Store results: call to builtin function " - "with wrong signature, not consuming reg or " - "frame index"); - } - } - } - } - } + case WebAssembly::CALL_I64: + Changed |= optimizeCall(MBB, MI, MRI, MDT, TLI, LibInfo); + break; } } -- 2.7.4