summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2019-04-23 03:43:26 +0000
committerSam Clegg <sbc@chromium.org>2019-04-23 03:43:26 +0000
commit9da81421b8da40f46065d1dc2bdcb7f77f496203 (patch)
treeda1ec97689930dc15811ed06174a6d46e262e748
parent727d6ca3f0a2fdeddfbe22de6812ab301c6a9da2 (diff)
downloadbcm5719-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.cpp17
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)
OpenPOWER on IntegriCloud