1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -analyze -scalar-evolution < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker!0 = !{i8 0, i8 127} 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine void @f0(i8* %len_addr) { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f0 7*9880d681SAndroid Build Coastguard Worker entry: 8*9880d681SAndroid Build Coastguard Worker %len = load i8, i8* %len_addr, !range !0 9*9880d681SAndroid Build Coastguard Worker %len_norange = load i8, i8* %len_addr 10*9880d681SAndroid Build Coastguard Worker; CHECK: %len = load i8, i8* %len_addr, !range !0 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len U: [0,127) S: [0,127) 12*9880d681SAndroid Build Coastguard Worker; CHECK: %len_norange = load i8, i8* %len_addr 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len_norange U: full-set S: full-set 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker %t0 = add i8 %len, 1 16*9880d681SAndroid Build Coastguard Worker %t1 = add i8 %len, 2 17*9880d681SAndroid Build Coastguard Worker; CHECK: %t0 = add i8 %len, 1 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (1 + %len)<nuw><nsw> U: [1,-128) S: [1,-128) 19*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = add i8 %len, 2 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (2 + %len)<nuw> U: [2,-127) S: [2,-127) 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker %t2 = sub i8 %len, 1 23*9880d681SAndroid Build Coastguard Worker %t3 = sub i8 %len, 2 24*9880d681SAndroid Build Coastguard Worker; CHECK: %t2 = sub i8 %len, 1 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-1 + %len)<nsw> U: [-1,126) S: [-1,126) 26*9880d681SAndroid Build Coastguard Worker; CHECK: %t3 = sub i8 %len, 2 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-2 + %len)<nsw> U: [-2,125) S: [-2,125) 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker %q0 = add i8 %len_norange, 1 30*9880d681SAndroid Build Coastguard Worker %q1 = add i8 %len_norange, 2 31*9880d681SAndroid Build Coastguard Worker; CHECK: %q0 = add i8 %len_norange, 1 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (1 + %len_norange) U: full-set S: full-set 33*9880d681SAndroid Build Coastguard Worker; CHECK: %q1 = add i8 %len_norange, 2 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (2 + %len_norange) U: full-set S: full-set 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker %q2 = sub i8 %len_norange, 1 37*9880d681SAndroid Build Coastguard Worker %q3 = sub i8 %len_norange, 2 38*9880d681SAndroid Build Coastguard Worker; CHECK: %q2 = sub i8 %len_norange, 1 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-1 + %len_norange) U: full-set S: full-set 40*9880d681SAndroid Build Coastguard Worker; CHECK: %q3 = sub i8 %len_norange, 2 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-2 + %len_norange) U: full-set S: full-set 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker ret void 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8* %len_addr) { 47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f1 48*9880d681SAndroid Build Coastguard Worker entry: 49*9880d681SAndroid Build Coastguard Worker %len = load i8, i8* %len_addr, !range !0 50*9880d681SAndroid Build Coastguard Worker %len_norange = load i8, i8* %len_addr 51*9880d681SAndroid Build Coastguard Worker; CHECK: %len = load i8, i8* %len_addr, !range !0 52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len U: [0,127) S: [0,127) 53*9880d681SAndroid Build Coastguard Worker; CHECK: %len_norange = load i8, i8* %len_addr 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len_norange U: full-set S: full-set 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker %t0 = add i8 %len, -1 57*9880d681SAndroid Build Coastguard Worker %t1 = add i8 %len, -2 58*9880d681SAndroid Build Coastguard Worker; CHECK: %t0 = add i8 %len, -1 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-1 + %len)<nsw> U: [-1,126) S: [-1,126) 60*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = add i8 %len, -2 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-2 + %len)<nsw> U: [-2,125) S: [-2,125) 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker %t0.sext = sext i8 %t0 to i16 64*9880d681SAndroid Build Coastguard Worker %t1.sext = sext i8 %t1 to i16 65*9880d681SAndroid Build Coastguard Worker; CHECK: %t0.sext = sext i8 %t0 to i16 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-1 + (zext i8 %len to i16))<nsw> U: [-1,126) S: [-1,126) 67*9880d681SAndroid Build Coastguard Worker; CHECK: %t1.sext = sext i8 %t1 to i16 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (-2 + (zext i8 %len to i16))<nsw> U: [-2,125) S: [-2,125) 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker %q0 = add i8 %len_norange, 1 71*9880d681SAndroid Build Coastguard Worker %q1 = add i8 %len_norange, 2 72*9880d681SAndroid Build Coastguard Worker; CHECK: %q0 = add i8 %len_norange, 1 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (1 + %len_norange) U: full-set S: full-set 74*9880d681SAndroid Build Coastguard Worker; CHECK: %q1 = add i8 %len_norange, 2 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (2 + %len_norange) U: full-set S: full-set 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker %q0.sext = sext i8 %q0 to i16 78*9880d681SAndroid Build Coastguard Worker %q1.sext = sext i8 %q1 to i16 79*9880d681SAndroid Build Coastguard Worker; CHECK: %q0.sext = sext i8 %q0 to i16 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (sext i8 (1 + %len_norange) to i16) U: [-128,128) S: [-128,128) 81*9880d681SAndroid Build Coastguard Worker; CHECK: %q1.sext = sext i8 %q1 to i16 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (sext i8 (2 + %len_norange) to i16) U: [-128,128) S: [-128,128) 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8* %len_addr) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Classifying expressions for: @f2 89*9880d681SAndroid Build Coastguard Worker entry: 90*9880d681SAndroid Build Coastguard Worker %len = load i8, i8* %len_addr, !range !0 91*9880d681SAndroid Build Coastguard Worker %len_norange = load i8, i8* %len_addr 92*9880d681SAndroid Build Coastguard Worker; CHECK: %len = load i8, i8* %len_addr, !range !0 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len U: [0,127) S: [0,127) 94*9880d681SAndroid Build Coastguard Worker; CHECK: %len_norange = load i8, i8* %len_addr 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> %len_norange U: full-set S: full-set 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker %t0 = add i8 %len, 1 98*9880d681SAndroid Build Coastguard Worker %t1 = add i8 %len, 2 99*9880d681SAndroid Build Coastguard Worker; CHECK: %t0 = add i8 %len, 1 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (1 + %len)<nuw><nsw> 101*9880d681SAndroid Build Coastguard Worker; CHECK: %t1 = add i8 %len, 2 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (2 + %len)<nuw> 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker %t0.zext = zext i8 %t0 to i16 105*9880d681SAndroid Build Coastguard Worker %t1.zext = zext i8 %t1 to i16 106*9880d681SAndroid Build Coastguard Worker; CHECK: %t0.zext = zext i8 %t0 to i16 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (1 + (zext i8 %len to i16))<nuw><nsw> U: [1,128) S: [1,128) 108*9880d681SAndroid Build Coastguard Worker; CHECK: %t1.zext = zext i8 %t1 to i16 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (2 + (zext i8 %len to i16))<nuw><nsw> U: [2,129) S: [2,129) 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker %q0 = add i8 %len_norange, 1 112*9880d681SAndroid Build Coastguard Worker %q1 = add i8 %len_norange, 2 113*9880d681SAndroid Build Coastguard Worker %q0.zext = zext i8 %q0 to i16 114*9880d681SAndroid Build Coastguard Worker %q1.zext = zext i8 %q1 to i16 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; CHECK: %q0.zext = zext i8 %q0 to i16 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (zext i8 (1 + %len_norange) to i16) U: [0,256) S: [0,256) 118*9880d681SAndroid Build Coastguard Worker; CHECK: %q1.zext = zext i8 %q1 to i16 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> (zext i8 (2 + %len_norange) to i16) U: [0,256) S: [0,256) 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker ret void 122*9880d681SAndroid Build Coastguard Worker} 123