166 lines · plain
1; RUN: opt -S -passes='require<scalar-evolution>,require<lazy-value-info>,loop-mssa(loop-predication)' -debug-pass-manager < %s 2>&1 | FileCheck %s2 3; NOTE: LazyValueAnalysis is an arbitrary analysis that just isn't preserved by4; this pass. If after your change this analysis is preserved by the pass,5; please update this test some other analysis that isn't preserved.6 7; CHECK: Running analysis: LazyValueAnalysis on drop_a_wc_and_leave_early8; CHECK: Running pass: LoopPredicationPass on loop %loop in function drop_a_wc_and_leave_early9; CHECK: Invalidating analysis: LazyValueAnalysis on drop_a_wc_and_leave_early10; CHECK: Running analysis: LazyValueAnalysis on drop_a_wc_and_leave11; CHECK: Running pass: LoopPredicationPass on loop %loop in function drop_a_wc_and_leave12; CHECK: Invalidating analysis: LazyValueAnalysis on drop_a_wc_and_leave13 14 15; This test makes the pass drop its attempts to optimize the exit condition in16; `%loop` BB by using unanalyzable `%cond_0` as an exit condition.17define i64 @drop_a_wc_and_leave_early(i64 %length, i64 %n, i1 %cond_0, i1 %cond_1) {18; Make sure the pass has only replaced `%wc2` with `true` in the definition of `%wb_cond`.19; CHECK-LABEL: define i64 @drop_a_wc_and_leave_early(i64 %length, i64 %n, i1 %cond_0, i1 %cond_1) {20; CHECK-NEXT: entry:21; CHECK-NEXT: %wc1 = call i1 @llvm.experimental.widenable.condition()22; CHECK-NEXT: %wc2 = call i1 @llvm.experimental.widenable.condition()23; CHECK-NEXT: %exiplicit_guard_cond = and i1 %cond_0, %wc124; CHECK-NEXT: br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !025; CHECK: deopt:26; CHECK-NEXT: %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]27; CHECK-NEXT: ret i64 %deoptret28; CHECK: loop.preheader:29; CHECK-NEXT: br label %loop30; CHECK: loop:31; CHECK-NEXT: %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]32; CHECK-NEXT: br i1 %cond_0, label %guarded, label %deopt2, !prof !033; CHECK: deopt2:34; CHECK-NEXT: %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]35; CHECK-NEXT: ret i64 %deoptret236; CHECK: guarded:37; CHECK-NEXT: %wb_cond = and i1 %cond_1, true38; CHECK-NEXT: br i1 %wb_cond, label %guarded2, label %deopt3, !prof !039; CHECK: deopt3:40; CHECK-NEXT: %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]41; CHECK-NEXT: ret i64 %deoptret342; CHECK: guarded2:43; CHECK-NEXT: %i.next = add nuw i64 %i, 144; CHECK-NEXT: %continue = icmp ult i64 %i.next, %n45; CHECK-NEXT: br i1 %continue, label %loop, label %exit46; CHECK: exit:47; CHECK-NEXT: ret i64 048; CHECK-NEXT: }49 50entry:51 %wc1 = call i1 @llvm.experimental.widenable.condition()52 %wc2 = call i1 @llvm.experimental.widenable.condition()53 %exiplicit_guard_cond = and i1 %cond_0, %wc154 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !055 56deopt:57 %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]58 ret i64 %deoptret59 60loop.preheader:61 br label %loop62 63loop:64 %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]65 br i1 %cond_0, label %guarded, label %deopt2, !prof !066 67deopt2:68 %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]69 ret i64 %deoptret270 71guarded:72 %wb_cond = and i1 %cond_1, %wc273 br i1 %wb_cond, label %guarded2, label %deopt3, !prof !074 75deopt3:76 %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]77 ret i64 %deoptret378 79guarded2:80 %i.next = add nuw i64 %i, 181 %continue = icmp ult i64 %i.next, %n82 br i1 %continue, label %loop, label %exit83 84exit:85 ret i64 086}87 88; This test makes the pass drop its attempts to optimize the exit condition in89; `%loop` BB by using trivial `false` as an exit condition.90define i64 @drop_a_wc_and_leave(i64 %n, i1 %cond_0, i1 %cond_1) {91; Make sure the pass has only replaced `%wc2` with `true` in the definition of `%wb_cond`.92; CHECK-LABEL: define i64 @drop_a_wc_and_leave(i64 %n, i1 %cond_0, i1 %cond_1) {93; CHECK-NEXT: entry:94; CHECK-NEXT: %wc1 = call i1 @llvm.experimental.widenable.condition()95; CHECK-NEXT: %wc2 = call i1 @llvm.experimental.widenable.condition()96; CHECK-NEXT: %exiplicit_guard_cond = and i1 %cond_0, %wc197; CHECK-NEXT: br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !098; CHECK: deopt:99; CHECK-NEXT: %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]100; CHECK-NEXT: ret i64 %deoptret101; CHECK: loop.preheader:102; CHECK-NEXT: br label %loop103; CHECK: loop:104; CHECK-NEXT: %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]105; CHECK-NEXT: br i1 false, label %guarded, label %deopt2, !prof !0106; CHECK: deopt2:107; CHECK-NEXT: %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]108; CHECK-NEXT: ret i64 %deoptret2109; CHECK: guarded:110; CHECK-NEXT: %wb_cond = and i1 %cond_1, true111; CHECK-NEXT: br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0112; CHECK: deopt3:113; CHECK-NEXT: %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]114; CHECK-NEXT: ret i64 %deoptret3115; CHECK: guarded2:116; CHECK-NEXT: %i.next = add nuw i64 %i, 1117; CHECK-NEXT: %continue = icmp ult i64 %i.next, %n118; CHECK-NEXT: br i1 %continue, label %loop, label %exit119; CHECK: exit:120; CHECK-NEXT: ret i64 0121; CHECK-NEXT: }122 123entry:124 %wc1 = call i1 @llvm.experimental.widenable.condition()125 %wc2 = call i1 @llvm.experimental.widenable.condition()126 %exiplicit_guard_cond = and i1 %cond_0, %wc1127 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0128 129deopt:130 %deoptret = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]131 ret i64 %deoptret132 133loop.preheader:134 br label %loop135 136loop:137 %i = phi i64 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]138 br i1 false, label %guarded, label %deopt2, !prof !0139 140deopt2:141 %deoptret2 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]142 ret i64 %deoptret2143 144guarded:145 %wb_cond = and i1 %cond_1, %wc2146 br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0147 148deopt3:149 %deoptret3 = call i64 (...) @llvm.experimental.deoptimize.i64() [ "deopt"() ]150 ret i64 %deoptret3151 152guarded2:153 %i.next = add nuw i64 %i, 1154 %continue = icmp ult i64 %i.next, %n155 br i1 %continue, label %loop, label %exit156 157exit:158 ret i64 0159}160 161 162declare i1 @llvm.experimental.widenable.condition()163declare i64 @llvm.experimental.deoptimize.i64(...)164 165!0 = !{!"branch_weights", i64 1048576, i64 1}166