1; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s 2 3define i32 @f0(i32 %x, i32 %y) { 4; CHECK-LABEL: Classifying expressions for: @f0 5 entry: 6 %c = icmp sgt i32 %y, 0 7 br i1 %c, label %add, label %merge 8 9 add: 10 %sum = add i32 %x, %y 11 br label %merge 12 13 merge: 14 %v = phi i32 [ %sum, %add ], [ %x, %entry ] 15; CHECK: %v = phi i32 [ %sum, %add ], [ %x, %entry ] 16; CHECK-NEXT: --> ((0 smax %y) + %x) U: full-set S: full-set 17 ret i32 %v 18} 19 20define i32 @f1(i32 %x, i32 %y) { 21; CHECK-LABEL: Classifying expressions for: @f1 22 entry: 23 %c = icmp sge i32 %y, 0 24 br i1 %c, label %add, label %merge 25 26 add: 27 %sum = add i32 %x, %y 28 br label %merge 29 30 merge: 31 %v = phi i32 [ %sum, %add ], [ %x, %entry ] 32; CHECK: %v = phi i32 [ %sum, %add ], [ %x, %entry ] 33; CHECK-NEXT: --> ((0 smax %y) + %x) U: full-set S: full-set 34 ret i32 %v 35} 36 37define i32 @f2(i32 %x, i32 %y, i32* %ptr) { 38; CHECK-LABEL: Classifying expressions for: @f2 39 entry: 40 %c = icmp sge i32 %y, 0 41 br i1 %c, label %add, label %merge 42 43 add: 44 %lv = load i32, i32* %ptr 45 br label %merge 46 47 merge: 48 %v = phi i32 [ %lv, %add ], [ %x, %entry ] 49; CHECK: %v = phi i32 [ %lv, %add ], [ %x, %entry ] 50; CHECK-NEXT: --> %v U: full-set S: full-set 51 ret i32 %v 52} 53 54define i32 @f3(i32 %x, i32 %init, i32 %lim) { 55; CHECK-LABEL: Classifying expressions for: @f3 56 entry: 57 br label %loop 58 59loop: 60 %iv = phi i32 [ %init, %entry ], [ %iv.inc, %merge ] 61 %iv.inc = add i32 %iv, 1 62 %c = icmp sge i32 %iv, 0 63 br i1 %c, label %add, label %merge 64 65 add: 66 %sum = add i32 %x, %iv 67 br label %merge 68 69 merge: 70 %v = phi i32 [ %sum, %add ], [ %x, %loop ] 71; CHECK: %v = phi i32 [ %sum, %add ], [ %x, %loop ] 72; CHECK-NEXT: --> ((0 smax {%init,+,1}<%loop>) + %x) U: full-set S: full-set 73 %be.cond = icmp eq i32 %iv.inc, %lim 74 br i1 %be.cond, label %loop, label %leave 75 76 leave: 77 ret i32 0 78} 79 80define i32 @f4(i32 %x, i32 %init, i32 %lim) { 81; CHECK-LABEL: Classifying expressions for: @f4 82 entry: 83 %c = icmp sge i32 %init, 0 84 br i1 %c, label %add, label %merge 85 86 add: 87 br label %loop 88 89 loop: 90 %iv = phi i32 [ %init, %add ], [ %iv.inc, %loop ] 91 %iv.inc = add i32 %iv, 1 92 %be.cond = icmp eq i32 %iv.inc, %lim 93 br i1 %be.cond, label %loop, label %add.cont 94 95 add.cont: 96 %sum = add i32 %x, %iv 97 br label %merge 98 99 merge: 100 %v = phi i32 [ %sum, %add.cont ], [ %x, %entry ] 101; CHECK: %v = phi i32 [ %sum, %add.cont ], [ %x, %entry ] 102; CHECK-NEXT: --> %v U: full-set S: full-set 103 ret i32 %v 104} 105 106define i32 @f5(i32* %val) { 107; CHECK-LABEL: Classifying expressions for: @f5 108entry: 109 br label %for.end 110 111for.condt: 112 br i1 true, label %for.cond.0, label %for.end 113 114for.end: 115 %inc = load i32, i32* %val 116 br i1 false, label %for.condt, label %for.cond.0 117 118for.cond.0: 119 %init = phi i32 [ 0, %for.condt ], [ %inc, %for.end ] 120 121; CHECK: %init = phi i32 [ 0, %for.condt ], [ %inc, %for.end ] 122; CHECK-NEXT: --> %init U: full-set S: full-set 123 124; Matching "through" %init will break LCSSA at the SCEV expression 125; level. 126 127 ret i32 %init 128} 129