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 /llvm/lib/Target/WebAssembly | |
| 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
Diffstat (limited to 'llvm/lib/Target/WebAssembly')
| -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) | 

