Add an instcombine to clean up a common pattern produced
[oota-llvm.git] / test / Transforms / InstCombine / trunc.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 ; Instcombine should be able to eliminate all of these ext casts.
4
5 declare void @use(i32)
6
7 define i64 @test1(i64 %a) {
8   %b = trunc i64 %a to i32
9   %c = and i32 %b, 15
10   %d = zext i32 %c to i64
11   call void @use(i32 %b)
12   ret i64 %d
13 ; CHECK: @test1
14 ; CHECK: %d = and i64 %a, 15
15 ; CHECK: ret i64 %d
16 }
17 define i64 @test2(i64 %a) {
18   %b = trunc i64 %a to i32
19   %c = shl i32 %b, 4
20   %q = ashr i32 %c, 4
21   %d = sext i32 %q to i64
22   call void @use(i32 %b)
23   ret i64 %d
24 ; CHECK: @test2
25 ; CHECK: shl i64 %a, 36
26 ; CHECK: %d = ashr i64 {{.*}}, 36
27 ; CHECK: ret i64 %d
28 }
29 define i64 @test3(i64 %a) {
30   %b = trunc i64 %a to i32
31   %c = and i32 %b, 8
32   %d = zext i32 %c to i64
33   call void @use(i32 %b)
34   ret i64 %d
35 ; CHECK: @test3
36 ; CHECK: %d = and i64 %a, 8
37 ; CHECK: ret i64 %d
38 }
39 define i64 @test4(i64 %a) {
40   %b = trunc i64 %a to i32
41   %c = and i32 %b, 8
42   %x = xor i32 %c, 8
43   %d = zext i32 %x to i64
44   call void @use(i32 %b)
45   ret i64 %d
46 ; CHECK: @test4
47 ; CHECK: = and i64 %a, 8
48 ; CHECK: %d = xor i64 {{.*}}, 8
49 ; CHECK: ret i64 %d
50 }
51
52 define i32 @test5(i32 %A) {
53   %B = zext i32 %A to i128
54   %C = lshr i128 %B, 16
55   %D = trunc i128 %C to i32
56   ret i32 %D
57 ; CHECK: @test5
58 ; CHECK: %C = lshr i32 %A, 16
59 ; CHECK: ret i32 %C
60 }
61
62 define i32 @test6(i64 %A) {
63   %B = zext i64 %A to i128
64   %C = lshr i128 %B, 32
65   %D = trunc i128 %C to i32
66   ret i32 %D
67 ; CHECK: @test6
68 ; CHECK: %C = lshr i64 %A, 32
69 ; CHECK: %D = trunc i64 %C to i32
70 ; CHECK: ret i32 %D
71 }
72
73 define i92 @test7(i64 %A) {
74   %B = zext i64 %A to i128
75   %C = lshr i128 %B, 32
76   %D = trunc i128 %C to i92
77   ret i92 %D
78 ; CHECK: @test7
79 ; CHECK: %C = lshr i64 %A, 32
80 ; CHECK: %D = zext i64 %C to i92
81 ; CHECK: ret i92 %D
82 }