1*9880d681SAndroid Build Coastguard Worker; RUN: opt -analyze -scalar-evolution -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i16 @test1(i8 %x) { 4*9880d681SAndroid Build Coastguard Worker %A = zext i8 %x to i12 5*9880d681SAndroid Build Coastguard Worker %B = sext i12 %A to i16 6*9880d681SAndroid Build Coastguard Worker; CHECK: zext i8 %x to i16 7*9880d681SAndroid Build Coastguard Worker ret i16 %B 8*9880d681SAndroid Build Coastguard Worker} 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine i8 @test2(i8 %x) { 11*9880d681SAndroid Build Coastguard Worker %A = zext i8 %x to i16 12*9880d681SAndroid Build Coastguard Worker %B = add i16 %A, 1025 13*9880d681SAndroid Build Coastguard Worker %C = trunc i16 %B to i8 14*9880d681SAndroid Build Coastguard Worker; CHECK: (1 + %x) 15*9880d681SAndroid Build Coastguard Worker ret i8 %C 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine i8 @test3(i8 %x) { 19*9880d681SAndroid Build Coastguard Worker %A = zext i8 %x to i16 20*9880d681SAndroid Build Coastguard Worker %B = mul i16 %A, 1027 21*9880d681SAndroid Build Coastguard Worker %C = trunc i16 %B to i8 22*9880d681SAndroid Build Coastguard Worker; CHECK: (3 * %x) 23*9880d681SAndroid Build Coastguard Worker ret i8 %C 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32 %x, i32 %y) { 27*9880d681SAndroid Build Coastguard Workerentry: 28*9880d681SAndroid Build Coastguard Worker %Y = and i32 %y, 3 29*9880d681SAndroid Build Coastguard Worker br label %loop 30*9880d681SAndroid Build Coastguard Workerloop: 31*9880d681SAndroid Build Coastguard Worker %A = phi i32 [0, %entry], [%I, %loop] 32*9880d681SAndroid Build Coastguard Worker %rand1 = icmp sgt i32 %A, %Y 33*9880d681SAndroid Build Coastguard Worker %Z1 = select i1 %rand1, i32 %A, i32 %Y 34*9880d681SAndroid Build Coastguard Worker %rand2 = icmp ugt i32 %A, %Z1 35*9880d681SAndroid Build Coastguard Worker %Z2 = select i1 %rand2, i32 %A, i32 %Z1 36*9880d681SAndroid Build Coastguard Worker; CHECK: %Z2 = 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> ([[EXPR:.*]]){{ U: [^ ]+ S: [^ ]+}}{{ +}}Exits: 20 38*9880d681SAndroid Build Coastguard Worker %B = trunc i32 %Z2 to i16 39*9880d681SAndroid Build Coastguard Worker %C = sext i16 %B to i30 40*9880d681SAndroid Build Coastguard Worker; CHECK: %C = 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: (trunc i32 ([[EXPR]]) to i30) 42*9880d681SAndroid Build Coastguard Worker %D = sext i16 %B to i32 43*9880d681SAndroid Build Coastguard Worker; CHECK: %D = 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ([[EXPR]]) 45*9880d681SAndroid Build Coastguard Worker %E = sext i16 %B to i34 46*9880d681SAndroid Build Coastguard Worker; CHECK: %E = 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: (zext i32 ([[EXPR]]) to i34) 48*9880d681SAndroid Build Coastguard Worker %F = zext i16 %B to i30 49*9880d681SAndroid Build Coastguard Worker; CHECK: %F = 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: (trunc i32 ([[EXPR]]) to i30 51*9880d681SAndroid Build Coastguard Worker %G = zext i16 %B to i32 52*9880d681SAndroid Build Coastguard Worker; CHECK: %G = 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ([[EXPR]]) 54*9880d681SAndroid Build Coastguard Worker %H = zext i16 %B to i34 55*9880d681SAndroid Build Coastguard Worker; CHECK: %H = 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: (zext i32 ([[EXPR]]) to i34) 57*9880d681SAndroid Build Coastguard Worker %I = add i32 %A, 1 58*9880d681SAndroid Build Coastguard Worker %0 = icmp ne i32 %A, 20 59*9880d681SAndroid Build Coastguard Worker br i1 %0, label %loop, label %exit 60*9880d681SAndroid Build Coastguard Workerexit: 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %i) { 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 66*9880d681SAndroid Build Coastguard Worker %A = and i32 %i, 1 67*9880d681SAndroid Build Coastguard Worker; CHECK: --> (zext i1 (trunc i32 %i to i1) to i32) 68*9880d681SAndroid Build Coastguard Worker %B = and i32 %i, 2 69*9880d681SAndroid Build Coastguard Worker; CHECK: --> (2 * (zext i1 (trunc i32 (%i /u 2) to i1) to i32)) 70*9880d681SAndroid Build Coastguard Worker %C = and i32 %i, 63 71*9880d681SAndroid Build Coastguard Worker; CHECK: --> (zext i6 (trunc i32 %i to i6) to i32) 72*9880d681SAndroid Build Coastguard Worker %D = and i32 %i, 126 73*9880d681SAndroid Build Coastguard Worker; CHECK: --> (2 * (zext i6 (trunc i32 (%i /u 2) to i6) to i32)) 74*9880d681SAndroid Build Coastguard Worker %E = and i32 %i, 64 75*9880d681SAndroid Build Coastguard Worker; CHECK: --> (64 * (zext i1 (trunc i32 (%i /u 64) to i1) to i32)) 76*9880d681SAndroid Build Coastguard Worker %F = and i32 %i, -2147483648 77*9880d681SAndroid Build Coastguard Worker; CHECK: --> (-2147483648 * (%i /u -2147483648)) 78*9880d681SAndroid Build Coastguard Worker ret void 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine void @test6(i8 %x) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6 83*9880d681SAndroid Build Coastguard Worker %A = zext i8 %x to i16 84*9880d681SAndroid Build Coastguard Worker %B = shl nuw i16 %A, 8 85*9880d681SAndroid Build Coastguard Worker %C = and i16 %B, -2048 86*9880d681SAndroid Build Coastguard Worker; CHECK: --> (2048 * ((zext i8 %x to i16) /u 8)) 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; PR22960 91*9880d681SAndroid Build Coastguard Workerdefine void @test7(i32 %A) { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7 93*9880d681SAndroid Build Coastguard Worker %B = sext i32 %A to i64 94*9880d681SAndroid Build Coastguard Worker %C = zext i32 %A to i64 95*9880d681SAndroid Build Coastguard Worker %D = sub i64 %B, %C 96*9880d681SAndroid Build Coastguard Worker %E = trunc i64 %D to i16 97*9880d681SAndroid Build Coastguard Worker; CHECK: %E 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: --> 0 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101