[llvm] [SimplifyCFG] Fix crash when there is unreachable large index (PR #88616)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 13 04:58:00 PDT 2024
https://github.com/vfdff created https://github.com/llvm/llvm-project/pull/88616
The large case index out of scope is dead code, but it is still be created in TableContents in SwitchLookupTable::SwitchLookupTable so make sure the table size after growing should not get smaller.
Fix https://github.com/llvm/llvm-project/issues/88607
>From ce88ccf751366e2c052663464d98cb148d5c493a Mon Sep 17 00:00:00 2001
From: zhongyunde 00443407 <zhongyunde at huawei.com>
Date: Sat, 13 Apr 2024 07:09:29 -0400
Subject: [PATCH] [SimplifyCFG] Fix crash when there is unreachable large index
The large case index out of scope is dead code, but it is still
be created in TableContents in SwitchLookupTable::SwitchLookupTable
so make sure the table size after growing should not get smaller.
Fix https://github.com/llvm/llvm-project/issues/88607
---
llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 4 ++-
.../Transforms/SimplifyCFG/switch_mask.ll | 25 +++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 55bbffb18879fb..728cd094e1ebc1 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -6783,9 +6783,11 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder,
return SwitchLookupTable::WouldFitInRegister(
DL, UpperBound, KV.second /* ResultType */);
})) {
+ // There may be some case index lager than the UpperBound (unreachable
+ // case), so make sure the table size does not get smaller.
+ TableSize = std::max(UpperBound, TableSize);
// The default branch is unreachable after we enlarge the lookup table.
// Adjust DefaultIsReachable to reuse code path.
- TableSize = UpperBound;
DefaultIsReachable = false;
}
}
diff --git a/llvm/test/Transforms/SimplifyCFG/switch_mask.ll b/llvm/test/Transforms/SimplifyCFG/switch_mask.ll
index 17f7b583ee840e..51c15774d47628 100644
--- a/llvm/test/Transforms/SimplifyCFG/switch_mask.ll
+++ b/llvm/test/Transforms/SimplifyCFG/switch_mask.ll
@@ -214,3 +214,28 @@ lor.end: ; preds = %default, %for.end,
%retval.0.i.i = phi i32 [ 1, %default ], [ 0, %for.end ], [ 0, %for.end ], [ 0, %for.end ]
ret void
}
+
+define i1 @pr88607() {
+; CHECK-LABEL: @pr88607(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = select i1 false, i32 4, i32 1
+; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 false, i32 2, i32 [[COND]]
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = select i1 false, i32 4, i32 1
+ %spec.select = select i1 false, i32 2, i32 %cond
+ switch i32 %spec.select, label %lor.rhs [
+ i32 0, label %exit
+ i32 5, label %exit ; unreachable large case index
+ i32 1, label %exit
+ ]
+
+lor.rhs: ; preds = %entry
+ br label %exit
+
+exit: ; preds = %lor.rhs, %entry, %entry, %entry, %entry
+ %res.ph = phi i1 [ false, %entry ], [ false, %lor.rhs ], [ false, %entry ], [ false, %entry ]
+ ret i1 %res.ph
+}
+
More information about the llvm-commits
mailing list