]> granicus.if.org Git - llvm/commitdiff
GlobalISel: fall back gracefully when we hit unhandled legalizer default.
authorTim Northover <tnorthover@apple.com>
Tue, 6 Dec 2016 19:02:15 +0000 (19:02 +0000)
committerTim Northover <tnorthover@apple.com>
Tue, 6 Dec 2016 19:02:15 +0000 (19:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288840 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/LegalizerInfo.cpp
test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll

index 2b99a5558586b98c393c4dcbf38d3091ba664fbe..e49662075ed5e10cd70b251fc4ade320ec9a7465 100644 (file)
@@ -93,7 +93,9 @@ LegalizerInfo::getAction(const InstrAspect &Aspect) const {
     if (DefaultAction != DefaultActions.end() && DefaultAction->second == Legal)
       return std::make_pair(Legal, Ty);
 
-    assert(DefaultAction->second == NarrowScalar && "unexpected default");
+    if (DefaultAction == DefaultActions.end() ||
+        DefaultAction->second != NarrowScalar)
+      return std::make_pair(Unsupported, LLT());
     return findLegalAction(Aspect, NarrowScalar);
   }
 
index d164e2ea2f32af5a1f92ea07b1885749347d9a07..e4a2bb2dbf548494c50114d05729f42984994b33 100644 (file)
@@ -74,3 +74,11 @@ define void @odd_type(i42* %addr) {
 define void @sequence_mapping([2 x i64] %in) {
   ret void
 }
+
+  ; Legalizer was asserting when it enountered an unexpected default action.
+; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for legal_default
+; FALLBACK-WITH-REPORT-LABEL: legal_default:
+define void @legal_default(i64 %in) {
+  insertvalue [2 x i64] undef, i64 %in, 0
+  ret void
+}