1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s 3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 5target triple = "x86_64-unknown-linux-gnu" 6 7define void @f_0() { 8; 9; CHECK-LABEL: 'f_0' 10; CHECK-NEXT: Determining loop execution counts for: @f_0 11; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 5 12; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 5 13; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 5 14; CHECK-NEXT: Loop %for.body: Trip multiple is 6 15; 16entry: 17 br label %for.body 18 19for.body: 20 %i.05 = phi i32 [ 32, %entry ], [ %div4, %for.body ] 21 tail call void @dummy() 22 %div4 = lshr i32 %i.05, 1 23 %cmp = icmp eq i32 %div4, 0 24 br i1 %cmp, label %for.cond.cleanup, label %for.body 25 26for.cond.cleanup: 27 ret void 28} 29 30; Do not compute exhaustive trip count based on FP libcalls, as their exact 31; return value may not be specified. 32define i64 @test_fp_libcall() { 33; CHECK-LABEL: 'test_fp_libcall' 34; CHECK-NEXT: Determining loop execution counts for: @test_fp_libcall 35; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 36; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 37; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 38; 39entry: 40 br label %loop 41 42loop: 43 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 44 %fv = phi double [ 1.000000e+00, %entry ], [ %fv.next, %loop ] 45 call void @use(double %fv) 46 %fv.next = call double @llvm.sin.f64(double %fv) 47 %iv.next = add i64 %iv, 1 48 %fcmp = fcmp une double %fv, 0x3FC6BA15EE8460B0 49 br i1 %fcmp, label %loop, label %exit 50 51exit: 52 ret i64 %iv 53} 54 55; Do not compute exhaustive trip count based on FP constant folding resulting 56; in NaN values, as we don't specify which NaN exactly is returned. 57define i64 @test_nan_sign() { 58; CHECK-LABEL: 'test_nan_sign' 59; CHECK-NEXT: Determining loop execution counts for: @test_nan_sign 60; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 61; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 62; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 63; 64entry: 65 br label %loop 66 67loop: 68 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 69 %fv = phi double [ -1.000000e+00, %entry ], [ %fv.next, %loop ] 70 call void @use(double %fv) 71 %a = fsub double %fv, 0x7F86C16C16C16C16 72 %b = fadd double %a, %a 73 %fv.next = fsub double %b, %a 74 %iv.next = add i64 %iv, 1 75 %fv.bc = bitcast double %fv to i64 76 %icmp = icmp slt i64 %fv.bc, 0 77 br i1 %icmp, label %loop, label %exit 78 79exit: 80 ret i64 %iv 81} 82 83; Do not compute exhaustive trip count based on FP constant folding if the 84; involved operation has nsz or one of the algebraic FMF flags (reassoc, arcp, 85; contract) set. The examples in the following are dummies and don't illustrate 86; real cases where FMF transforms could cause issues. 87 88define i64 @test_fp_nsz() { 89; CHECK-LABEL: 'test_fp_nsz' 90; CHECK-NEXT: Determining loop execution counts for: @test_fp_nsz 91; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 92; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 93; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 94; 95entry: 96 br label %loop 97 98loop: 99 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 100 %fv = phi double [ 1.000000e+00, %entry ], [ %fv.next, %loop ] 101 call void @use(double %fv) 102 %fv.next = fadd nsz double %fv, 1.0 103 %iv.next = add i64 %iv, 1 104 %fcmp = fcmp une double %fv, 100.0 105 br i1 %fcmp, label %loop, label %exit 106 107exit: 108 ret i64 %iv 109} 110 111define i64 @test_fp_reassoc() { 112; CHECK-LABEL: 'test_fp_reassoc' 113; CHECK-NEXT: Determining loop execution counts for: @test_fp_reassoc 114; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 115; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 116; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 117; 118entry: 119 br label %loop 120 121loop: 122 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 123 %fv = phi double [ 1.000000e+00, %entry ], [ %fv.next, %loop ] 124 call void @use(double %fv) 125 %fv.next = fadd reassoc double %fv, 1.0 126 %iv.next = add i64 %iv, 1 127 %fcmp = fcmp une double %fv, 100.0 128 br i1 %fcmp, label %loop, label %exit 129 130exit: 131 ret i64 %iv 132} 133 134define i64 @test_fp_arcp() { 135; CHECK-LABEL: 'test_fp_arcp' 136; CHECK-NEXT: Determining loop execution counts for: @test_fp_arcp 137; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 138; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 139; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 140; 141entry: 142 br label %loop 143 144loop: 145 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 146 %fv = phi double [ 1.000000e+00, %entry ], [ %fv.next, %loop ] 147 call void @use(double %fv) 148 %fv.next = fadd arcp double %fv, 1.0 149 %iv.next = add i64 %iv, 1 150 %fcmp = fcmp une double %fv, 100.0 151 br i1 %fcmp, label %loop, label %exit 152 153exit: 154 ret i64 %iv 155} 156 157define i64 @test_fp_contract() { 158; CHECK-LABEL: 'test_fp_contract' 159; CHECK-NEXT: Determining loop execution counts for: @test_fp_contract 160; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 161; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 162; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 163; 164entry: 165 br label %loop 166 167loop: 168 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 169 %fv = phi double [ 1.000000e+00, %entry ], [ %fv.next, %loop ] 170 call void @use(double %fv) 171 %fv.next = fadd contract double %fv, 1.0 172 %iv.next = add i64 %iv, 1 173 %fcmp = fcmp une double %fv, 100.0 174 br i1 %fcmp, label %loop, label %exit 175 176exit: 177 ret i64 %iv 178} 179 180declare void @dummy() 181declare void @use(double %i) 182declare double @llvm.sin.f64(double) 183