
Although an unreachable BB is skipped by processBlock, its successor can still be handled by processBlock, and maybeMergeBasicBlockIntoOnlyPred may merge the two BBs and delete the unreachable BB. Then the garbage pointer is left in Unreachable set. This patch avoids merging a BB into unreachable predecessor.
42 lines
1.1 KiB
LLVM
42 lines
1.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: opt -S -passes=jump-threading < %s | FileCheck %s
|
|
|
|
; Make sure this does not crash due to conflicting known bits.
|
|
|
|
define i32 @test() {
|
|
; CHECK-LABEL: define i32 @test() {
|
|
; CHECK-NEXT: join.thread:
|
|
; CHECK-NEXT: br label [[END:%.*]]
|
|
; CHECK: unreachable:
|
|
; CHECK-NEXT: [[SH_PROM:%.*]] = zext i32 -1 to i64
|
|
; CHECK-NEXT: [[SHL:%.*]] = shl nsw i64 -1, [[SH_PROM]]
|
|
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[SHL]] to i32
|
|
; CHECK-NEXT: br label [[JOIN:%.*]]
|
|
; CHECK: join:
|
|
; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[CONV]], [[UNREACHABLE:%.*]] ]
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 0
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[END]], label [[END]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 0
|
|
;
|
|
entry:
|
|
br label %join
|
|
|
|
unreachable:
|
|
%sh_prom = zext i32 -1 to i64
|
|
%shl = shl nsw i64 -1, %sh_prom
|
|
%conv = trunc i64 %shl to i32
|
|
br label %join
|
|
|
|
join:
|
|
%phi = phi i32 [ %conv, %unreachable ], [ 0, %entry ]
|
|
%cmp = icmp eq i32 %phi, 0
|
|
br i1 %cmp, label %end, label %if
|
|
|
|
if:
|
|
br label %end
|
|
|
|
end:
|
|
ret i32 0
|
|
}
|