1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s 3 4define i32 @widget() { 5; CHECK-LABEL: 'widget' 6; CHECK-NEXT: Classifying expressions for: @widget 7; CHECK-NEXT: %phi = phi i32 [ 0, %b ], [ %udiv6, %b5 ] 8; CHECK-NEXT: --> %phi U: [0,1) S: [0,1) Exits: <<Unknown>> LoopDispositions: { %b1: Variant } 9; CHECK-NEXT: %phi2 = phi i32 [ 1, %b ], [ %add, %b5 ] 10; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%b1> U: [1,2) S: [1,2) Exits: <<Unknown>> LoopDispositions: { %b1: Computable } 11; CHECK-NEXT: %udiv = udiv i32 10, %phi2 12; CHECK-NEXT: --> (10 /u {1,+,1}<nuw><nsw><%b1>) U: [10,11) S: [10,11) Exits: <<Unknown>> LoopDispositions: { %b1: Computable } 13; CHECK-NEXT: %urem = urem i32 %udiv, 10 14; CHECK-NEXT: --> ((-10 * ((10 /u {1,+,1}<nuw><nsw><%b1>) /u 10))<nuw><nsw> + (10 /u {1,+,1}<nuw><nsw><%b1>)) U: [0,1) S: [0,1) Exits: <<Unknown>> LoopDispositions: { %b1: Computable } 15; CHECK-NEXT: %udiv6 = udiv i32 %phi2, 0 16; CHECK-NEXT: --> ({1,+,1}<nuw><nsw><%b1> /u 0) U: empty-set S: empty-set Exits: <<Unknown>> LoopDispositions: { %b1: Computable } 17; CHECK-NEXT: %add = add i32 %phi2, 1 18; CHECK-NEXT: --> {2,+,1}<nuw><nsw><%b1> U: [2,3) S: [2,3) Exits: <<Unknown>> LoopDispositions: { %b1: Computable } 19; CHECK-NEXT: Determining loop execution counts for: @widget 20; CHECK-NEXT: Loop %b1: <multiple exits> Unpredictable backedge-taken count. 21; CHECK-NEXT: exit count for b1: ***COULDNOTCOMPUTE*** 22; CHECK-NEXT: exit count for b3: i32 0 23; CHECK-NEXT: Loop %b1: constant max backedge-taken count is i32 0 24; CHECK-NEXT: Loop %b1: symbolic max backedge-taken count is i32 0 25; CHECK-NEXT: symbolic max exit count for b1: ***COULDNOTCOMPUTE*** 26; CHECK-NEXT: symbolic max exit count for b3: i32 0 27; 28b: 29 br label %b1 30 31b1: ; preds = %b5, %b 32 %phi = phi i32 [ 0, %b ], [ %udiv6, %b5 ] 33 %phi2 = phi i32 [ 1, %b ], [ %add, %b5 ] 34 %icmp = icmp eq i32 %phi, 0 35 br i1 %icmp, label %b3, label %b8 36 37b3: ; preds = %b1 38 %udiv = udiv i32 10, %phi2 39 %urem = urem i32 %udiv, 10 40 %icmp4 = icmp eq i32 %urem, 0 41 br i1 %icmp4, label %b7, label %b5 42 43b5: ; preds = %b3 44 %udiv6 = udiv i32 %phi2, 0 45 %add = add i32 %phi2, 1 46 br label %b1 47 48b7: ; preds = %b3 49 ret i32 5 50 51b8: ; preds = %b1 52 ret i32 7 53} 54 55; Don't fold %indvar2 into (zext {0,+,1}) * %a 56define i64 @test_poisonous(i64 %a, i32 %n) { 57; CHECK-LABEL: 'test_poisonous' 58; CHECK-NEXT: Classifying expressions for: @test_poisonous 59; CHECK-NEXT: %indvar1 = phi i32 [ 0, %entry ], [ %indvar1.next, %loop.body ] 60; CHECK-NEXT: --> {0,+,1}<%loop.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable } 61; CHECK-NEXT: %indvar2 = phi i64 [ 0, %entry ], [ %mul, %loop.body ] 62; CHECK-NEXT: --> %indvar2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Variant } 63; CHECK-NEXT: %indvar1.next = add i32 %indvar1, 1 64; CHECK-NEXT: --> {1,+,1}<%loop.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable } 65; CHECK-NEXT: %ext = zext i32 %indvar1.next to i64 66; CHECK-NEXT: --> (zext i32 {1,+,1}<%loop.body> to i64) U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable } 67; CHECK-NEXT: %mul = mul i64 %ext, %a 68; CHECK-NEXT: --> ((zext i32 {1,+,1}<%loop.body> to i64) * %a) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop.body: Computable } 69; CHECK-NEXT: Determining loop execution counts for: @test_poisonous 70; CHECK-NEXT: Loop %loop.body: Unpredictable backedge-taken count. 71; CHECK-NEXT: Loop %loop.body: Unpredictable constant max backedge-taken count. 72; CHECK-NEXT: Loop %loop.body: Unpredictable symbolic max backedge-taken count. 73; CHECK-NEXT: Loop %loop.body: Predicated backedge-taken count is (-1 + (1 smax (1 + (sext i32 %n to i64))<nsw>))<nsw> 74; CHECK-NEXT: Predicates: 75; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw> 76; CHECK-NEXT: Loop %loop.body: Predicated constant max backedge-taken count is i64 2147483647 77; CHECK-NEXT: Predicates: 78; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw> 79; CHECK-NEXT: Loop %loop.body: Predicated symbolic max backedge-taken count is (-1 + (1 smax (1 + (sext i32 %n to i64))<nsw>))<nsw> 80; CHECK-NEXT: Predicates: 81; CHECK-NEXT: {1,+,1}<%loop.body> Added Flags: <nssw> 82; 83entry: 84 br label %loop.body 85 86loop.body: 87 %indvar1 = phi i32 [ 0, %entry ], [ %indvar1.next, %loop.body ] 88 %indvar2 = phi i64 [ 0, %entry ], [ %mul, %loop.body ] 89 %indvar1.next = add i32 %indvar1, 1 90 %ext = zext i32 %indvar1.next to i64 91 %mul = mul i64 %ext, %a 92 %exitcond = icmp sgt i32 %indvar1.next, %n 93 br i1 %exitcond, label %loop.exit, label %loop.body 94 95loop.exit: 96 ret i64 %mul 97} 98