weiguozhi 11e65b98b3
[JumpThreading] Remove deleted BB from Unreachable (#126984)
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.
2025-02-27 15:40:21 -08:00

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
}