[llvm] 16a62d4 - [LoopPredication] Add testcase showing BPI computation. NFC

Anna Thomas via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 27 13:54:37 PDT 2021


Author: Anna Thomas
Date: 2021-09-27T16:54:22-04:00
New Revision: 16a62d4f3dca189b0e0565c7ebcd83ddfcc67629

URL: https://github.com/llvm/llvm-project/commit/16a62d4f3dca189b0e0565c7ebcd83ddfcc67629
DIFF: https://github.com/llvm/llvm-project/commit/16a62d4f3dca189b0e0565c7ebcd83ddfcc67629.diff

LOG: [LoopPredication] Add testcase showing BPI computation. NFC

Precommit testcase for D110438. Since we do not preserve BPI in loop
pass manager, we are forced to compute BPI everytime Loop predication is
invoked.
The patch referenced changes that behaviour by preserving lossy BPI for
loop passes.

Added: 
    llvm/test/Transforms/LoopPredication/preserve-bpi.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/LoopPredication/preserve-bpi.ll b/llvm/test/Transforms/LoopPredication/preserve-bpi.ll
new file mode 100644
index 0000000000000..954caef6f746b
--- /dev/null
+++ b/llvm/test/Transforms/LoopPredication/preserve-bpi.ll
@@ -0,0 +1,70 @@
+; RUN: opt -passes='require<scalar-evolution>,require<branch-prob>,loop-mssa(loop-predication,licm,simple-loop-unswitch<nontrivial>,loop-simplifycfg)' -debug-pass-manager -debug-only=branch-prob -S < %s 2>&1 | FileCheck %s
+
+; REQUIRES: asserts
+
+declare void @llvm.experimental.guard(i1, ...)
+
+; CHECK: Running analysis: ScalarEvolutionAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: TargetLibraryAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: AssumptionAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: LoopAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running pass: RequireAnalysisPass<llvm::BranchProbabilityAnalysis, llvm::Function> on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: BranchProbabilityAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: Running analysis: PostDominatorTreeAnalysis on unsigned_loop_0_to_n_ult_check
+; CHECK-NEXT: ---- Branch Probability Info : unsigned_loop_0_to_n_ult_check ----
+; CHECK: Running pass: LoopSimplifyPass on unsigned_loop_0_to_n_ult_check
+; CHECK: Running pass: LoopPredicationPass on Loop at depth 1
+; CHECK-NEXT: ---- Branch Probability Info : unsigned_loop_0_to_n_ult_check ----
+; CHECK: Running pass: LICMPass on Loop at depth 1
+; CHECK-NEXT: Running pass: SimpleLoopUnswitchPass on Loop at depth 1
+; CHECK-NEXT: Running pass: LoopPredicationPass on Loop at depth 1
+; CHECK-NEXT: ---- Branch Probability Info : unsigned_loop_0_to_n_ult_check ----
+; CHECK: Running pass: LICMPass on Loop at depth 1
+; CHECK-NEXT: Running pass: SimpleLoopUnswitchPass on Loop at depth 1
+; CHECK-NEXT: Running pass: LoopSimplifyCFGPass on Loop at depth 1
+; CHECK-NEXT: Invalidating analysis: BranchProbabilityAnalysis on unsigned_loop_0_to_n_ult_check
+
+
+define i32 @unsigned_loop_0_to_n_ult_check(i32* %array, i32 %length, i32 %n) {
+entry:
+  %tmp5 = icmp eq i32 %n, 0
+  br i1 %tmp5, label %exit, label %loop.preheader
+
+loop.preheader:                                   ; preds = %entry
+  br label %loop
+
+loop:                                             ; preds = %guarded, %loop.preheader
+  %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
+  %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
+  %within.bounds = icmp ult i32 %i, %length
+  %widenable_cond = call i1 @llvm.experimental.widenable.condition()
+  %exiplicit_guard_cond = and i1 %within.bounds, %widenable_cond
+  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
+
+deopt:                                            ; preds = %loop
+  %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32(i32 9) [ "deopt"() ]
+  ret i32 %deoptcall
+
+guarded:                                          ; preds = %loop
+  %i.i64 = zext i32 %i to i64
+  %array.i.ptr = getelementptr inbounds i32, i32* %array, i64 %i.i64
+  %array.i = load i32, i32* %array.i.ptr, align 4
+  %loop.acc.next = add i32 %loop.acc, %array.i
+  %i.next = add nuw i32 %i, 1
+  %continue = icmp ult i32 %i.next, %n
+  br i1 %continue, label %loop, label %exit, !prof !2
+
+exit:                                             ; preds = %guarded, %entry
+  %result = phi i32 [ 0, %entry ], [ %loop.acc.next, %guarded ]
+  ret i32 %result
+}
+
+declare i32 @llvm.experimental.deoptimize.i32(...)
+declare i1 @llvm.experimental.widenable.condition() #0
+
+attributes #0 = { inaccessiblememonly nounwind }
+
+!0 = !{!"branch_weights", i32 1048576, i32 1}
+!1 = !{i32 1, i32 -2147483648}
+!2 = !{!"branch_weights", i32 1024, i32 1}


        


More information about the llvm-commits mailing list