CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
166 lines
6.4 KiB
LLVM
166 lines
6.4 KiB
LLVM
; RUN: opt -S -passes='require<scalar-evolution>,require<lazy-value-info>,loop-mssa(loop-predication)' -debug-pass-manager < %s 2>&1 | FileCheck %s
|
|
|
|
; NOTE: LazyValueAnalysis is an arbitrary analysis that just isn't preserved by
|
|
; this pass. If after your change this analysis is preserved by the pass,
|
|
; please update this test some other analysis that isn't preserved.
|
|
|
|
; CHECK: Running analysis: LazyValueAnalysis on drop_a_wc_and_leave_early
|
|
; CHECK: Running pass: LoopPredicationPass on loop %loop in function drop_a_wc_and_leave_early
|
|
; CHECK: Invalidating analysis: LazyValueAnalysis on drop_a_wc_and_leave_early
|
|
; CHECK: Running analysis: LazyValueAnalysis on drop_a_wc_and_leave
|
|
; CHECK: Running pass: LoopPredicationPass on loop %loop in function drop_a_wc_and_leave
|
|
; CHECK: Invalidating analysis: LazyValueAnalysis on drop_a_wc_and_leave
|
|
|
|
|
|
; This test makes the pass drop its attempts to optimize the exit condition in
|
|
; `%loop` BB by using unanalyzable `%cond_0` as an exit condition.
|
|
define i64 @drop_a_wc_and_leave_early(i64 %length, i64 %n, i1 %cond_0, i1 %cond_1) {
|
|
; Make sure the pass has only replaced `%wc2` with `true` in the definition of `%wb_cond`.
|
|
; CHECK-LABEL: define i64 @drop_a_wc_and_leave_early(i64 %length, i64 %n, i1 %cond_0, i1 %cond_1) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: %wc1 = call i1 @llvm.experimental.widenable.condition()
|
|
; CHECK-NEXT: %wc2 = call i1 @llvm.experimental.widenable.condition()
|
|
; CHECK-NEXT: %exiplicit_guard_cond = and i1 %cond_0, %wc1
|
|
; CHECK-NEXT: br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
|
|
; CHECK: deopt:
|
|
; CHECK-NEXT: %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret
|
|
; CHECK: loop.preheader:
|
|
; CHECK-NEXT: br label %loop
|
|
; CHECK: loop:
|
|
; CHECK-NEXT: %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
|
|
; CHECK-NEXT: br i1 %cond_0, label %guarded, label %deopt2, !prof !0
|
|
; CHECK: deopt2:
|
|
; CHECK-NEXT: %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret2
|
|
; CHECK: guarded:
|
|
; CHECK-NEXT: %wb_cond = and i1 %cond_1, true
|
|
; CHECK-NEXT: br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0
|
|
; CHECK: deopt3:
|
|
; CHECK-NEXT: %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret3
|
|
; CHECK: guarded2:
|
|
; CHECK-NEXT: %i.next = add nuw i64 %i, 1
|
|
; CHECK-NEXT: %continue = icmp ult i64 %i.next, %n
|
|
; CHECK-NEXT: br i1 %continue, label %loop, label %exit
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: ret i64 0
|
|
; CHECK-NEXT: }
|
|
|
|
entry:
|
|
%wc1 = call i1 @llvm.experimental.widenable.condition()
|
|
%wc2 = call i1 @llvm.experimental.widenable.condition()
|
|
%exiplicit_guard_cond = and i1 %cond_0, %wc1
|
|
br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
|
|
|
|
deopt:
|
|
%deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret
|
|
|
|
loop.preheader:
|
|
br label %loop
|
|
|
|
loop:
|
|
%i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
|
|
br i1 %cond_0, label %guarded, label %deopt2, !prof !0
|
|
|
|
deopt2:
|
|
%deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret2
|
|
|
|
guarded:
|
|
%wb_cond = and i1 %cond_1, %wc2
|
|
br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0
|
|
|
|
deopt3:
|
|
%deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret3
|
|
|
|
guarded2:
|
|
%i.next = add nuw i64 %i, 1
|
|
%continue = icmp ult i64 %i.next, %n
|
|
br i1 %continue, label %loop, label %exit
|
|
|
|
exit:
|
|
ret i64 0
|
|
}
|
|
|
|
; This test makes the pass drop its attempts to optimize the exit condition in
|
|
; `%loop` BB by using trivial `false` as an exit condition.
|
|
define i64 @drop_a_wc_and_leave(i64 %n, i1 %cond_0, i1 %cond_1) {
|
|
; Make sure the pass has only replaced `%wc2` with `true` in the definition of `%wb_cond`.
|
|
; CHECK-LABEL: define i64 @drop_a_wc_and_leave(i64 %n, i1 %cond_0, i1 %cond_1) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: %wc1 = call i1 @llvm.experimental.widenable.condition()
|
|
; CHECK-NEXT: %wc2 = call i1 @llvm.experimental.widenable.condition()
|
|
; CHECK-NEXT: %exiplicit_guard_cond = and i1 %cond_0, %wc1
|
|
; CHECK-NEXT: br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
|
|
; CHECK: deopt:
|
|
; CHECK-NEXT: %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret
|
|
; CHECK: loop.preheader:
|
|
; CHECK-NEXT: br label %loop
|
|
; CHECK: loop:
|
|
; CHECK-NEXT: %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
|
|
; CHECK-NEXT: br i1 false, label %guarded, label %deopt2, !prof !0
|
|
; CHECK: deopt2:
|
|
; CHECK-NEXT: %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret2
|
|
; CHECK: guarded:
|
|
; CHECK-NEXT: %wb_cond = and i1 %cond_1, true
|
|
; CHECK-NEXT: br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0
|
|
; CHECK: deopt3:
|
|
; CHECK-NEXT: %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
; CHECK-NEXT: ret i64 %deoptret3
|
|
; CHECK: guarded2:
|
|
; CHECK-NEXT: %i.next = add nuw i64 %i, 1
|
|
; CHECK-NEXT: %continue = icmp ult i64 %i.next, %n
|
|
; CHECK-NEXT: br i1 %continue, label %loop, label %exit
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: ret i64 0
|
|
; CHECK-NEXT: }
|
|
|
|
entry:
|
|
%wc1 = call i1 @llvm.experimental.widenable.condition()
|
|
%wc2 = call i1 @llvm.experimental.widenable.condition()
|
|
%exiplicit_guard_cond = and i1 %cond_0, %wc1
|
|
br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
|
|
|
|
deopt:
|
|
%deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret
|
|
|
|
loop.preheader:
|
|
br label %loop
|
|
|
|
loop:
|
|
%i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
|
|
br i1 false, label %guarded, label %deopt2, !prof !0
|
|
|
|
deopt2:
|
|
%deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret2
|
|
|
|
guarded:
|
|
%wb_cond = and i1 %cond_1, %wc2
|
|
br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0
|
|
|
|
deopt3:
|
|
%deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]
|
|
ret i64 %deoptret3
|
|
|
|
guarded2:
|
|
%i.next = add nuw i64 %i, 1
|
|
%continue = icmp ult i64 %i.next, %n
|
|
br i1 %continue, label %loop, label %exit
|
|
|
|
exit:
|
|
ret i64 0
|
|
}
|
|
|
|
|
|
declare i1 @llvm.experimental.widenable.condition()
|
|
declare i64 @llvm.experimental.deoptimize.i64(...)
|
|
|
|
!0 = !{!"branch_weights", i64 1048576, i64 1}
|