diff options
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp | 25 | ||||
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp | 26 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll | 11 |
3 files changed, 42 insertions, 20 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp index 39a4bf9dce5..5f457f0a06e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp @@ -113,16 +113,21 @@ bool WebAssemblyPeephole::runOnMachineFunction(MachineFunction &MF) { Name == TLI.getLibcallName(RTLIB::MEMSET)) { LibFunc::Func Func; if (LibInfo.getLibFunc(Name, Func)) { - if (!MI.getOperand(2).isReg()) - report_fatal_error( - "Call to builtin function with wrong signature"); - MachineOperand &MO = MI.getOperand(0); - unsigned OldReg = MO.getReg(); - unsigned NewReg = MI.getOperand(2).getReg(); - if (MRI.getRegClass(NewReg) != MRI.getRegClass(OldReg)) - report_fatal_error( - "Call to builtin function with wrong signature"); - Changed |= MaybeRewriteToDiscard(OldReg, NewReg, MO, MFI, MRI); + const auto &Op2 = MI.getOperand(2); + if (Op2.isReg()) { + MachineOperand &MO = MI.getOperand(0); + unsigned OldReg = MO.getReg(); + unsigned NewReg = Op2.getReg(); + if (MRI.getRegClass(NewReg) != MRI.getRegClass(OldReg)) + report_fatal_error("Peephole: call to builtin function with " + "wrong signature, from/to mismatch"); + Changed |= MaybeRewriteToDiscard(OldReg, NewReg, MO, MFI, MRI); + } else if (Op2.isFI()) { + break; + } else { + report_fatal_error("Peephole: call to builtin function with " + "wrong signature, not consuming reg"); + } } } } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp index 1d7fe387c41..5368ab7bf4c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp @@ -150,16 +150,22 @@ bool WebAssemblyStoreResults::runOnMachineFunction(MachineFunction &MF) { Name == TLI.getLibcallName(RTLIB::MEMSET)) { LibFunc::Func Func; if (LibInfo.getLibFunc(Name, Func)) { - if (!MI.getOperand(2).isReg()) - report_fatal_error( - "Call to builtin function with wrong signature"); - unsigned FromReg = MI.getOperand(2).getReg(); - unsigned ToReg = MI.getOperand(0).getReg(); - if (MRI.getRegClass(FromReg) != MRI.getRegClass(ToReg)) - report_fatal_error( - "Call to builtin function with wrong signature"); - Changed |= - ReplaceDominatedUses(MBB, MI, FromReg, ToReg, MRI, MDT); + 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"); + } } } } diff --git a/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll b/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll index ba2f1e702af..bb7e8dd26d8 100644 --- a/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll +++ b/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll @@ -58,3 +58,14 @@ define void @set_no(i8* %dst, i8 %src, i32 %len) { call void @llvm.memset.p0i8.i32(i8* %dst, i8 %src, i32 %len, i32 1, i1 false) ret void } + +; CHECK-LABEL: frame_index: +; CHECK: i32.call $discard=, memset@FUNCTION, $3, $pop1, $pop0{{$}} +; CHECK: return{{$}} +define void @frame_index() { +entry: + %a = alloca [2048 x i8], align 16 + %0 = getelementptr inbounds [2048 x i8], [2048 x i8]* %a, i32 0, i32 0 + call void @llvm.memset.p0i8.i32(i8* %0, i8 256, i32 1024, i32 16, i1 false) + ret void +} |

