summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp5
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp15
-rw-r--r--llvm/test/CodeGen/WebAssembly/store-results.ll10
3 files changed, 24 insertions, 6 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp
index 46f271c20af..3397f598759 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp
@@ -74,8 +74,9 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex(
// generate broken code.
report_fatal_error("Memory offset field overflow");
}
- MI.getOperand(1).setImm(Offset);
- MI.getOperand(2).ChangeToRegister(WebAssembly::SP32, /*IsDef=*/false);
+ MI.getOperand(FIOperandNum - 1).setImm(Offset);
+ MI.getOperand(FIOperandNum)
+ .ChangeToRegister(WebAssembly::SP32, /*IsDef=*/false);
} else {
// Otherwise create an i32.add SP, offset and make it the operand.
auto &MRI = MF.getRegInfo();
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp
index 5368ab7bf4c..4035eae83f3 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp
@@ -134,10 +134,17 @@ bool WebAssemblyStoreResults::runOnMachineFunction(MachineFunction &MF) {
case WebAssembly::STORE_F64:
case WebAssembly::STORE_I32:
case WebAssembly::STORE_I64: {
- unsigned ToReg = MI.getOperand(0).getReg();
- unsigned FromReg =
- MI.getOperand(WebAssembly::StoreValueOperandNo).getReg();
- Changed |= ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT);
+ 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");
+ }
break;
}
case WebAssembly::CALL_I32:
diff --git a/llvm/test/CodeGen/WebAssembly/store-results.ll b/llvm/test/CodeGen/WebAssembly/store-results.ll
index 488579a756e..55900992d46 100644
--- a/llvm/test/CodeGen/WebAssembly/store-results.ll
+++ b/llvm/test/CodeGen/WebAssembly/store-results.ll
@@ -59,3 +59,13 @@ for.body5.i:
for.cond.cleanup4.i:
ret void
}
+
+; CHECK-LABEL: fi_ret:
+; CHECK: i32.store $discard=,
+define hidden i8* @fi_ret(i8** %addr) {
+entry:
+ %buf = alloca [27 x i8], align 16
+ %0 = getelementptr inbounds [27 x i8], [27 x i8]* %buf, i32 0, i32 0
+ store i8* %0, i8** %addr
+ ret i8* %0
+}
OpenPOWER on IntegriCloud