diff options
author | JF Bastien <jfb@google.com> | 2016-01-26 20:22:42 +0000 |
---|---|---|
committer | JF Bastien <jfb@google.com> | 2016-01-26 20:22:42 +0000 |
commit | 1a6c7608b1f47dadf7adae8dbc1fb8345f7ff15e (patch) | |
tree | 574ee329cac3ed73909e74f1e955bf5eaf6878ee /llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp | |
parent | bacf7e4f397f5863e52a0fad4155abd9a6b84b8c (diff) | |
download | bcm5719-llvm-1a6c7608b1f47dadf7adae8dbc1fb8345f7ff15e.tar.gz bcm5719-llvm-1a6c7608b1f47dadf7adae8dbc1fb8345f7ff15e.zip |
WebAssembly: don't optimize memcpy/memmove/memcpy to frame index
r258781 optimized memcpy/memmove/memcpy so the intrinsic call can return its first argument, but missed the frame index case. Teach it to ignore that case so C code doesn't assert out in these cases.
llvm-svn: 258851
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyStoreResults.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
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"); + } } } } |