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