1; RUN: opt < %s -instcombine -S | FileCheck %s 2target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 3 4; Instcombine should be able to eliminate all of these ext casts. 5 6declare void @use(i32) 7 8define i64 @test1(i64 %a) { 9 %b = trunc i64 %a to i32 10 %c = and i32 %b, 15 11 %d = zext i32 %c to i64 12 call void @use(i32 %b) 13 ret i64 %d 14; CHECK: @test1 15; CHECK: %d = and i64 %a, 15 16; CHECK: ret i64 %d 17} 18define i64 @test2(i64 %a) { 19 %b = trunc i64 %a to i32 20 %c = shl i32 %b, 4 21 %q = ashr i32 %c, 4 22 %d = sext i32 %q to i64 23 call void @use(i32 %b) 24 ret i64 %d 25; CHECK: @test2 26; CHECK: shl i64 %a, 36 27; CHECK: %d = ashr exact i64 {{.*}}, 36 28; CHECK: ret i64 %d 29} 30define i64 @test3(i64 %a) { 31 %b = trunc i64 %a to i32 32 %c = and i32 %b, 8 33 %d = zext i32 %c to i64 34 call void @use(i32 %b) 35 ret i64 %d 36; CHECK: @test3 37; CHECK: %d = and i64 %a, 8 38; CHECK: ret i64 %d 39} 40define i64 @test4(i64 %a) { 41 %b = trunc i64 %a to i32 42 %c = and i32 %b, 8 43 %x = xor i32 %c, 8 44 %d = zext i32 %x to i64 45 call void @use(i32 %b) 46 ret i64 %d 47; CHECK: @test4 48; CHECK: = and i64 %a, 8 49; CHECK: %d = xor i64 {{.*}}, 8 50; CHECK: ret i64 %d 51} 52 53define i32 @test5(i32 %A) { 54 %B = zext i32 %A to i128 55 %C = lshr i128 %B, 16 56 %D = trunc i128 %C to i32 57 ret i32 %D 58; CHECK: @test5 59; CHECK: %C = lshr i32 %A, 16 60; CHECK: ret i32 %C 61} 62 63define i32 @test6(i64 %A) { 64 %B = zext i64 %A to i128 65 %C = lshr i128 %B, 32 66 %D = trunc i128 %C to i32 67 ret i32 %D 68; CHECK: @test6 69; CHECK: %C = lshr i64 %A, 32 70; CHECK: %D = trunc i64 %C to i32 71; CHECK: ret i32 %D 72} 73 74define i92 @test7(i64 %A) { 75 %B = zext i64 %A to i128 76 %C = lshr i128 %B, 32 77 %D = trunc i128 %C to i92 78 ret i92 %D 79; CHECK: @test7 80; CHECK: %B = zext i64 %A to i92 81; CHECK: %C = lshr i92 %B, 32 82; CHECK: ret i92 %C 83} 84 85define i64 @test8(i32 %A, i32 %B) { 86 %tmp38 = zext i32 %A to i128 87 %tmp32 = zext i32 %B to i128 88 %tmp33 = shl i128 %tmp32, 32 89 %ins35 = or i128 %tmp33, %tmp38 90 %tmp42 = trunc i128 %ins35 to i64 91 ret i64 %tmp42 92; CHECK: @test8 93; CHECK: %tmp38 = zext i32 %A to i64 94; CHECK: %tmp32 = zext i32 %B to i64 95; CHECK: %tmp33 = shl nuw i64 %tmp32, 32 96; CHECK: %ins35 = or i64 %tmp33, %tmp38 97; CHECK: ret i64 %ins35 98} 99 100define i8 @test9(i32 %X) { 101 %Y = and i32 %X, 42 102 %Z = trunc i32 %Y to i8 103 ret i8 %Z 104; CHECK: @test9 105; CHECK: trunc 106; CHECK: and 107; CHECK: ret 108} 109 110; rdar://8808586 111define i8 @test10(i32 %X) { 112 %Y = trunc i32 %X to i8 113 %Z = and i8 %Y, 42 114 ret i8 %Z 115; CHECK: @test10 116; CHECK: trunc 117; CHECK: and 118; CHECK: ret 119} 120