diff options
author | Sam Clegg <sbc@chromium.org> | 2019-04-23 03:43:26 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2019-04-23 03:43:26 +0000 |
commit | 9da81421b8da40f46065d1dc2bdcb7f77f496203 (patch) | |
tree | da1ec97689930dc15811ed06174a6d46e262e748 | |
parent | 727d6ca3f0a2fdeddfbe22de6812ab301c6a9da2 (diff) | |
download | bcm5719-llvm-9da81421b8da40f46065d1dc2bdcb7f77f496203.tar.gz bcm5719-llvm-9da81421b8da40f46065d1dc2bdcb7f77f496203.zip |
[WebAssembly] Bail out of fastisel earlier when computing PIC addresses
This change partially reverts https://reviews.llvm.org/D54647 in favor
of bailing out during computeAddress instead.
This catches the condition earlier and handles more cases.
Differential Revision: https://reviews.llvm.org/D60986
llvm-svn: 358948
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp index 2d9aae7a698..535a925c033 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp @@ -151,7 +151,7 @@ private: return MVT::INVALID_SIMPLE_VALUE_TYPE; } bool computeAddress(const Value *Obj, Address &Addr); - bool materializeLoadStoreOperands(Address &Addr); + void materializeLoadStoreOperands(Address &Addr); void addLoadStoreOperands(const Address &Addr, const MachineInstrBuilder &MIB, MachineMemOperand *MMO); unsigned maskI1Value(unsigned Reg, const Value *V); @@ -207,7 +207,6 @@ public: } // end anonymous namespace bool WebAssemblyFastISel::computeAddress(const Value *Obj, Address &Addr) { - const User *U = nullptr; unsigned Opcode = Instruction::UserOp1; if (const auto *I = dyn_cast<Instruction>(Obj)) { @@ -230,6 +229,8 @@ bool WebAssemblyFastISel::computeAddress(const Value *Obj, Address &Addr) { return false; if (const auto *GV = dyn_cast<GlobalValue>(Obj)) { + if (TLI.isPositionIndependent()) + return false; if (Addr.getGlobalValue()) return false; Addr.setGlobalValue(GV); @@ -374,13 +375,10 @@ bool WebAssemblyFastISel::computeAddress(const Value *Obj, Address &Addr) { return Addr.getReg() != 0; } -bool WebAssemblyFastISel::materializeLoadStoreOperands(Address &Addr) { +void WebAssemblyFastISel::materializeLoadStoreOperands(Address &Addr) { if (Addr.isRegBase()) { unsigned Reg = Addr.getReg(); if (Reg == 0) { - const GlobalValue *GV = Addr.getGlobalValue(); - if (GV && TLI.isPositionIndependent()) - return false; Reg = createResultReg(Subtarget->hasAddr64() ? &WebAssembly::I64RegClass : &WebAssembly::I32RegClass); unsigned Opc = Subtarget->hasAddr64() ? WebAssembly::CONST_I64 @@ -390,7 +388,6 @@ bool WebAssemblyFastISel::materializeLoadStoreOperands(Address &Addr) { Addr.setReg(Reg); } } - return true; } void WebAssemblyFastISel::addLoadStoreOperands(const Address &Addr, @@ -1190,8 +1187,7 @@ bool WebAssemblyFastISel::selectLoad(const Instruction *I) { return false; } - if (!materializeLoadStoreOperands(Addr)) - return false; + materializeLoadStoreOperands(Addr); unsigned ResultReg = createResultReg(RC); auto MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc), @@ -1243,8 +1239,7 @@ bool WebAssemblyFastISel::selectStore(const Instruction *I) { return false; } - if (!materializeLoadStoreOperands(Addr)) - return false; + materializeLoadStoreOperands(Addr); unsigned ValueReg = getRegForValue(Store->getValueOperand()); if (ValueReg == 0) |