183 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 42; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s3 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_011; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 512; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 513; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 514; CHECK-NEXT: Loop %for.body: Trip multiple is 615;16entry:17 br label %for.body18 19for.body:20 %i.05 = phi i32 [ 32, %entry ], [ %div4, %for.body ]21 tail call void @dummy()22 %div4 = lshr i32 %i.05, 123 %cmp = icmp eq i32 %div4, 024 br i1 %cmp, label %for.cond.cleanup, label %for.body25 26for.cond.cleanup:27 ret void28}29 30; Do not compute exhaustive trip count based on FP libcalls, as their exact31; 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_libcall35; 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 %loop41 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, 148 %fcmp = fcmp une double %fv, 0x3FC6BA15EE8460B049 br i1 %fcmp, label %loop, label %exit50 51exit:52 ret i64 %iv53}54 55; Do not compute exhaustive trip count based on FP constant folding resulting56; 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_sign60; 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 %loop66 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, 0x7F86C16C16C16C1672 %b = fadd double %a, %a73 %fv.next = fsub double %b, %a74 %iv.next = add i64 %iv, 175 %fv.bc = bitcast double %fv to i6476 %icmp = icmp slt i64 %fv.bc, 077 br i1 %icmp, label %loop, label %exit78 79exit:80 ret i64 %iv81}82 83; Do not compute exhaustive trip count based on FP constant folding if the84; 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 illustrate86; 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_nsz91; 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 %loop97 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.0103 %iv.next = add i64 %iv, 1104 %fcmp = fcmp une double %fv, 100.0105 br i1 %fcmp, label %loop, label %exit106 107exit:108 ret i64 %iv109}110 111define i64 @test_fp_reassoc() {112; CHECK-LABEL: 'test_fp_reassoc'113; CHECK-NEXT: Determining loop execution counts for: @test_fp_reassoc114; 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 %loop120 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.0126 %iv.next = add i64 %iv, 1127 %fcmp = fcmp une double %fv, 100.0128 br i1 %fcmp, label %loop, label %exit129 130exit:131 ret i64 %iv132}133 134define i64 @test_fp_arcp() {135; CHECK-LABEL: 'test_fp_arcp'136; CHECK-NEXT: Determining loop execution counts for: @test_fp_arcp137; 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 %loop143 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.0149 %iv.next = add i64 %iv, 1150 %fcmp = fcmp une double %fv, 100.0151 br i1 %fcmp, label %loop, label %exit152 153exit:154 ret i64 %iv155}156 157define i64 @test_fp_contract() {158; CHECK-LABEL: 'test_fp_contract'159; CHECK-NEXT: Determining loop execution counts for: @test_fp_contract160; 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 %loop166 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.0172 %iv.next = add i64 %iv, 1173 %fcmp = fcmp une double %fv, 100.0174 br i1 %fcmp, label %loop, label %exit175 176exit:177 ret i64 %iv178}179 180declare void @dummy()181declare void @use(double %i)182declare double @llvm.sin.f64(double)183