llvm-project/llvm/test/Transforms/SimplifyCFG/jump-threading-max-jump-threading-live-blocks.ll
LU-JOHN a757f23404
[SimplifyCFG] Extend jump-threading to allow live local defs (#135079)
Extend jump-threading to allow local defs that are live outside of the
threaded block. Allow threading to destinations where the local defs are
not live.

---------

Signed-off-by: John Lu <John.Lu@amd.com>
2025-07-31 09:44:14 -04:00

96 lines
4.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes=simplifycfg -S -max-jump-threading-live-blocks=3 < %s | FileCheck %s --check-prefixes=CHECK_LIMIT_3
; RUN: opt -passes=simplifycfg -S -max-jump-threading-live-blocks=4 < %s | FileCheck %s --check-prefixes=CHECK_LIMIT_4
; Test option -max-jump-threading-live-blocks=<num>
define void @testB(ptr %ptrA, ptr %ptrB, i64 %a, i64 %b, i64 %c) {
; CHECK_LIMIT_3-LABEL: define void @testB(
; CHECK_LIMIT_3-SAME: ptr [[PTRA:%.*]], ptr [[PTRB:%.*]], i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]]) {
; CHECK_LIMIT_3-NEXT: [[MAINA:.*]]:
; CHECK_LIMIT_3-NEXT: [[COND:%.*]] = icmp slt i64 [[A]], [[B]]
; CHECK_LIMIT_3-NEXT: br i1 [[COND]], label %[[IFA:.*]], label %[[MAINB:.*]]
; CHECK_LIMIT_3: [[IFA]]:
; CHECK_LIMIT_3-NEXT: [[TMP0:%.*]] = load i64, ptr [[PTRA]], align 4
; CHECK_LIMIT_3-NEXT: br label %[[MAINB]]
; CHECK_LIMIT_3: [[MAINB]]:
; CHECK_LIMIT_3-NEXT: [[VALUE:%.*]] = phi i64 [ [[TMP0]], %[[IFA]] ], [ 0, %[[MAINA]] ]
; CHECK_LIMIT_3-NEXT: br i1 [[COND]], label %[[IFB:.*]], label %[[MAINC:.*]]
; CHECK_LIMIT_3: [[IFB]]:
; CHECK_LIMIT_3-NEXT: [[COND2:%.*]] = icmp slt i64 [[A]], [[C]]
; CHECK_LIMIT_3-NEXT: br i1 [[COND2]], label %[[IFB_ARM1:.*]], label %[[IFB_ARM2:.*]]
; CHECK_LIMIT_3: [[IFB_ARM1]]:
; CHECK_LIMIT_3-NEXT: [[PTR_ARM1:%.*]] = getelementptr i64, ptr [[PTRB]], i64 8
; CHECK_LIMIT_3-NEXT: store i128 0, ptr [[PTR_ARM1]], align 4
; CHECK_LIMIT_3-NEXT: br label %[[IFB_JOIN:.*]]
; CHECK_LIMIT_3: [[IFB_ARM2]]:
; CHECK_LIMIT_3-NEXT: [[PTR_ARM2:%.*]] = getelementptr i64, ptr [[PTRB]], i64 16
; CHECK_LIMIT_3-NEXT: store i128 0, ptr [[PTR_ARM2]], align 4
; CHECK_LIMIT_3-NEXT: br label %[[IFB_JOIN]]
; CHECK_LIMIT_3: [[IFB_JOIN]]:
; CHECK_LIMIT_3-NEXT: [[PTRC:%.*]] = phi ptr [ [[PTR_ARM1]], %[[IFB_ARM1]] ], [ [[PTR_ARM2]], %[[IFB_ARM2]] ]
; CHECK_LIMIT_3-NEXT: store i64 [[VALUE]], ptr [[PTRC]], align 4
; CHECK_LIMIT_3-NEXT: br label %[[MAINC]]
; CHECK_LIMIT_3: [[MAINC]]:
; CHECK_LIMIT_3-NEXT: ret void
;
; CHECK_LIMIT_4-LABEL: define void @testB(
; CHECK_LIMIT_4-SAME: ptr [[PTRA:%.*]], ptr [[PTRB:%.*]], i64 [[A:%.*]], i64 [[B:%.*]], i64 [[C:%.*]]) {
; CHECK_LIMIT_4-NEXT: [[MAINA:.*:]]
; CHECK_LIMIT_4-NEXT: [[COND:%.*]] = icmp slt i64 [[A]], [[B]]
; CHECK_LIMIT_4-NEXT: br i1 [[COND]], label %[[IFA:.*]], label %[[MAINC:.*]]
; CHECK_LIMIT_4: [[IFA]]:
; CHECK_LIMIT_4-NEXT: [[TMP0:%.*]] = load i64, ptr [[PTRA]], align 4
; CHECK_LIMIT_4-NEXT: [[COND2:%.*]] = icmp slt i64 [[A]], [[C]]
; CHECK_LIMIT_4-NEXT: br i1 [[COND2]], label %[[IFB_ARM1:.*]], label %[[IFB_ARM2:.*]]
; CHECK_LIMIT_4: [[IFB_ARM1]]:
; CHECK_LIMIT_4-NEXT: [[PTR_ARM1:%.*]] = getelementptr i64, ptr [[PTRB]], i64 8
; CHECK_LIMIT_4-NEXT: store i128 0, ptr [[PTR_ARM1]], align 4
; CHECK_LIMIT_4-NEXT: br label %[[IFB_JOIN:.*]]
; CHECK_LIMIT_4: [[IFB_ARM2]]:
; CHECK_LIMIT_4-NEXT: [[PTR_ARM2:%.*]] = getelementptr i64, ptr [[PTRB]], i64 16
; CHECK_LIMIT_4-NEXT: store i128 0, ptr [[PTR_ARM2]], align 4
; CHECK_LIMIT_4-NEXT: br label %[[IFB_JOIN]]
; CHECK_LIMIT_4: [[IFB_JOIN]]:
; CHECK_LIMIT_4-NEXT: [[PTRC:%.*]] = phi ptr [ [[PTR_ARM1]], %[[IFB_ARM1]] ], [ [[PTR_ARM2]], %[[IFB_ARM2]] ]
; CHECK_LIMIT_4-NEXT: store i64 [[TMP0]], ptr [[PTRC]], align 4
; CHECK_LIMIT_4-NEXT: br label %[[MAINC]]
; CHECK_LIMIT_4: [[MAINC]]:
; CHECK_LIMIT_4-NEXT: ret void
;
mainA:
%cond = icmp slt i64 %a, %b
br i1 %cond, label %ifA, label %mainB
ifA:
%518 = load i64, ptr %ptrA
br label %mainB
; Use of %value is not in either immediate destination of mainB.
mainB:
%value = phi i64 [ %518, %ifA ], [ zeroinitializer, %mainA ]
br i1 %cond, label %ifB, label %mainC
ifB:
%cond2 = icmp slt i64 %a, %c
br i1 %cond2, label %ifB_arm1, label %ifB_arm2
ifB_arm1:
%ptr_arm1 = getelementptr i64, ptr %ptrB, i64 8
store i128 0, ptr %ptr_arm1
br label %ifB_join
ifB_arm2:
%ptr_arm2 = getelementptr i64, ptr %ptrB, i64 16
store i128 0, ptr %ptr_arm2
br label %ifB_join
ifB_join:
%ptrC = phi ptr [ %ptr_arm1, %ifB_arm1 ], [ %ptr_arm2, %ifB_arm2 ]
store i64 %value, ptr %ptrC
br label %mainC
mainC:
ret void
}