brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 3fc8369 Raw
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