summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2018-05-22 04:58:36 +0000
committerDan Gohman <dan433584@gmail.com>2018-05-22 04:58:36 +0000
commitb81848272dc60d6ada098e6efe004140533ea277 (patch)
treeef19b0db70aea3f14c57bd34fdb8546b80c71c77 /llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
parent19da66759944f2a3d2b7142e76a409c68d4c87fd (diff)
downloadbcm5719-llvm-b81848272dc60d6ada098e6efe004140533ea277.tar.gz
bcm5719-llvm-b81848272dc60d6ada098e6efe004140533ea277.zip
[WebAssembly] Fix fast-isel lowering illegal argument and return types.
For both argument and return types, promote illegal types like i24 to i32, and if a type can't be easily promoted, clear out the signature before bailing out, so avoid leaving it in a partially complete state. Fixes PR37546. llvm-svn: 332947
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
index fe821ced672..7b5eab42f87 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
@@ -700,14 +700,22 @@ bool WebAssemblyFastISel::fastLowerArguments() {
MRI.addLiveIn(WebAssembly::ARGUMENTS);
auto *MFI = MF->getInfo<WebAssemblyFunctionInfo>();
- for (auto const &Arg : F->args())
- MFI->addParam(getLegalType(getSimpleType(Arg.getType())));
+ for (auto const &Arg : F->args()) {
+ MVT::SimpleValueType ArgTy = getLegalType(getSimpleType(Arg.getType()));
+ if (ArgTy == MVT::INVALID_SIMPLE_VALUE_TYPE) {
+ MFI->clearParamsAndResults();
+ return false;
+ }
+ MFI->addParam(ArgTy);
+ }
if (!F->getReturnType()->isVoidTy()) {
- MVT::SimpleValueType RetTy = getSimpleType(F->getReturnType());
- if (RetTy == MVT::INVALID_SIMPLE_VALUE_TYPE)
+ MVT::SimpleValueType RetTy = getLegalType(getSimpleType(F->getReturnType()));
+ if (RetTy == MVT::INVALID_SIMPLE_VALUE_TYPE) {
+ MFI->clearParamsAndResults();
return false;
- MFI->addResult(getLegalType(RetTy));
+ }
+ MFI->addResult(RetTy);
}
return true;
OpenPOWER on IntegriCloud