diff options
| author | Florian Hahn <flo@fhahn.com> | 2019-05-08 09:09:54 +0000 |
|---|---|---|
| committer | Florian Hahn <flo@fhahn.com> | 2019-05-08 09:09:54 +0000 |
| commit | 3c696b3e7c21815662247e2af0346a596a4d0668 (patch) | |
| tree | ba572c4b5a00edd620e0fae585401e4bf9769cf6 /llvm/test/Transforms | |
| parent | 4c32d4fd9f07af76eb96e2e91da1a3df983bf9e7 (diff) | |
| download | bcm5719-llvm-3c696b3e7c21815662247e2af0346a596a4d0668.tar.gz bcm5719-llvm-3c696b3e7c21815662247e2af0346a596a4d0668.zip | |
[SCCP] Fix crash when trying to constant-fold terminators multiple times.
If we fold a branch/switch to an unconditional branch to another dead block we
replace the branch with unreachable, to avoid attempting to fold the
unconditional branch.
Reviewers: davide, efriedma, mssimpso, jdoerfert
Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D61300
llvm-svn: 360232
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/SCCP/switch-constantfold-crash.ll | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SCCP/switch-constantfold-crash.ll b/llvm/test/Transforms/SCCP/switch-constantfold-crash.ll new file mode 100644 index 00000000000..7596a56b812 --- /dev/null +++ b/llvm/test/Transforms/SCCP/switch-constantfold-crash.ll @@ -0,0 +1,92 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -ipsccp < %s -S | FileCheck %s +; RUN: opt -passes=ipsccp < %s -S | FileCheck %s + +define void @barney() { +; CHECK-LABEL: @barney( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label %bb9 +; CHECK: bb6: +; CHECK-NEXT: unreachable +; CHECK: bb9: +; CHECK-NEXT: unreachable +; +bb: + br label %bb9 + +bb6: ; preds = %bb9 + unreachable + +bb7: ; preds = %bb9 + unreachable + +bb9: ; preds = %bb + switch i16 0, label %bb6 [ + i16 61, label %bb7 + ] +} + +define void @blam() { +; CHECK-LABEL: @blam( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label %bb16 +; CHECK: bb16: +; CHECK-NEXT: br label %bb38 +; CHECK: bb38: +; CHECK-NEXT: unreachable +; +bb: + br label %bb16 + +bb16: ; preds = %bb + switch i32 0, label %bb38 [ + i32 66, label %bb17 + i32 63, label %bb18 + i32 86, label %bb19 + ] + +bb17: ; preds = %bb16 + unreachable + +bb18: ; preds = %bb16 + unreachable + +bb19: ; preds = %bb16 + unreachable + +bb38: ; preds = %bb16 + unreachable +} + + +define void @hoge() { +; CHECK-LABEL: @hoge( +; CHECK-NEXT: bb: +; CHECK-NEXT: br label %bb2 +; CHECK: bb2: +; CHECK-NEXT: unreachable +; CHECK: bb3: +; CHECK-NEXT: unreachable +; +bb: + switch i16 undef, label %bb1 [ + i16 135, label %bb2 + i16 66, label %bb2 + ] + +bb1: ; preds = %bb + ret void + +bb2: ; preds = %bb, %bb + switch i16 0, label %bb3 [ + i16 61, label %bb4 + i16 54, label %bb4 + i16 49, label %bb4 + ] + +bb3: ; preds = %bb2 + unreachable + +bb4: ; preds = %bb2, %bb2, %bb2 + unreachable +} |

