1; RUN: opt -analyze -enable-new-pm=0 -scalar-evolution -S < %s | FileCheck %s 2; RUN: opt -disable-output "-passes=print<scalar-evolution>" -S < %s 2>&1 | FileCheck %s 3 4define i16 @test1(i8 %x) { 5 %A = zext i8 %x to i12 6 %B = sext i12 %A to i16 7; CHECK: zext i8 %x to i16 8 ret i16 %B 9} 10 11define i8 @test2(i8 %x) { 12 %A = zext i8 %x to i16 13 %B = add i16 %A, 1025 14 %C = trunc i16 %B to i8 15; CHECK: (1 + %x) 16 ret i8 %C 17} 18 19define i8 @test3(i8 %x) { 20 %A = zext i8 %x to i16 21 %B = mul i16 %A, 1027 22 %C = trunc i16 %B to i8 23; CHECK: (3 * %x) 24 ret i8 %C 25} 26 27define void @test4(i32 %x, i32 %y) { 28entry: 29 %Y = and i32 %y, 3 30 br label %loop 31loop: 32 %A = phi i32 [0, %entry], [%I, %loop] 33 %rand1 = icmp sgt i32 %A, %Y 34 %Z1 = select i1 %rand1, i32 %A, i32 %Y 35 %rand2 = icmp ugt i32 %A, %Z1 36 %Z2 = select i1 %rand2, i32 %A, i32 %Z1 37; CHECK: %Z2 = 38; CHECK-NEXT: --> ([[EXPR:.*]]){{ U: [^ ]+ S: [^ ]+}}{{ +}}Exits: 20 39 %B = trunc i32 %Z2 to i16 40 %C = sext i16 %B to i30 41; CHECK: %C = 42; CHECK-NEXT: (trunc i32 ([[EXPR]]) to i30) 43 %D = sext i16 %B to i32 44; CHECK: %D = 45; CHECK-NEXT: ([[EXPR]]) 46 %E = sext i16 %B to i34 47; CHECK: %E = 48; CHECK-NEXT: (zext i32 ([[EXPR]]) to i34) 49 %F = zext i16 %B to i30 50; CHECK: %F = 51; CHECK-NEXT: (trunc i32 ([[EXPR]]) to i30 52 %G = zext i16 %B to i32 53; CHECK: %G = 54; CHECK-NEXT: ([[EXPR]]) 55 %H = zext i16 %B to i34 56; CHECK: %H = 57; CHECK-NEXT: (zext i32 ([[EXPR]]) to i34) 58 %I = add i32 %A, 1 59 %0 = icmp ne i32 %A, 20 60 br i1 %0, label %loop, label %exit 61exit: 62 ret void 63} 64 65define void @test5(i32 %i) { 66; CHECK-LABEL: @test5 67 %A = and i32 %i, 1 68; CHECK: --> (zext i1 (trunc i32 %i to i1) to i32) 69 %B = and i32 %i, 2 70; CHECK: --> (2 * (zext i1 (trunc i32 (%i /u 2) to i1) to i32)) 71 %C = and i32 %i, 63 72; CHECK: --> (zext i6 (trunc i32 %i to i6) to i32) 73 %D = and i32 %i, 126 74; CHECK: --> (2 * (zext i6 (trunc i32 (%i /u 2) to i6) to i32)) 75 %E = and i32 %i, 64 76; CHECK: --> (64 * (zext i1 (trunc i32 (%i /u 64) to i1) to i32)) 77 %F = and i32 %i, -2147483648 78; CHECK: --> (-2147483648 * (%i /u -2147483648)) 79 ret void 80} 81 82define void @test6(i8 %x) { 83; CHECK-LABEL: @test6 84 %A = zext i8 %x to i16 85 %B = shl nuw i16 %A, 8 86 %C = and i16 %B, -2048 87; CHECK: --> (2048 * ((zext i8 %x to i16) /u 8)) 88 ret void 89} 90 91; PR22960 92define void @test7(i32 %A) { 93; CHECK-LABEL: @test7 94 %B = sext i32 %A to i64 95 %C = zext i32 %A to i64 96 %D = sub i64 %B, %C 97 %E = trunc i64 %D to i16 98; CHECK: %E 99; CHECK-NEXT: --> 0 100 ret void 101} 102 103define i64 @test8(i64 %a) { 104; CHECK-LABEL: @test8 105 %t0 = udiv i64 %a, 56 106 %t1 = udiv i64 %t0, 56 107; CHECK: %t1 108; CHECK-NEXT: --> (%a /u 3136) 109 ret i64 %t1 110} 111 112define i64 @test9(i64 %a) { 113; CHECK-LABEL: @test9 114 %t0 = udiv i64 %a, 100000000000000 115 %t1 = udiv i64 %t0, 100000000000000 116; CHECK: %t1 117; CHECK-NEXT: --> 0 118 ret i64 %t1 119} 120 121define i64 @test10(i64 %a, i64 %b) { 122; CHECK-LABEL: @test10 123 %t0 = udiv i64 %a, 100000000000000 124 %t1 = udiv i64 %t0, 100000000000000 125 %t2 = mul i64 %b, %t1 126; CHECK: %t2 127; CHECK-NEXT: --> 0 128 ret i64 %t2 129} 130 131define i64 @test11(i64 %a) { 132; CHECK-LABEL: @test11 133 %t0 = udiv i64 0, %a 134; CHECK: %t0 135; CHECK-NEXT: --> 0 136 ret i64 %t0 137} 138