use getPredicateOnEdge to fold comparisons through PHI nodes,
[oota-llvm.git] / test / Transforms / InstCombine / sext-misc.ll
1 ; RUN: opt < %s -instcombine -S | not grep sext
2
3 target 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"
4
5 declare i32 @llvm.ctpop.i32(i32)
6 declare i32 @llvm.ctlz.i32(i32)
7 declare i32 @llvm.cttz.i32(i32)
8
9 define i64 @foo(i32 %x) {
10   %t = call i32 @llvm.ctpop.i32(i32 %x)
11   %s = sext i32 %t to i64
12   ret i64 %s
13 }
14 define i64 @boo(i32 %x) {
15   %t = call i32 @llvm.ctlz.i32(i32 %x)
16   %s = sext i32 %t to i64
17   ret i64 %s
18 }
19 define i64 @zoo(i32 %x) {
20   %t = call i32 @llvm.cttz.i32(i32 %x)
21   %s = sext i32 %t to i64
22   ret i64 %s
23 }
24 define i64 @coo(i32 %x) {
25   %t = udiv i32 %x, 3
26   %s = sext i32 %t to i64
27   ret i64 %s
28 }
29 define i64 @moo(i32 %x) {
30   %t = urem i32 %x, 30000
31   %s = sext i32 %t to i64
32   ret i64 %s
33 }
34 define i64 @yoo(i32 %x) {
35   %u = lshr i32 %x, 3
36   %t = mul i32 %u, 3
37   %s = sext i32 %t to i64
38   ret i64 %s
39 }
40 define i64 @voo(i32 %x) {
41   %t = and i32 %x, 511
42   %u = sub i32 20000, %t
43   %s = sext i32 %u to i64
44   ret i64 %s
45 }
46 define i32 @woo(i8 %a, i32 %f, i1 %p, i32* %z) {
47   %d = lshr i32 %f, 24
48   %e = select i1 %p, i32 %d, i32 0
49   %s = trunc i32 %e to i16
50   %n = sext i16 %s to i32
51   ret i32 %n
52 }
53
54 ; rdar://6013816
55 define i16 @test(i16 %t, i1 %cond) nounwind {
56 entry:
57         br i1 %cond, label %T, label %F
58 T:
59         %t2 = sext i16 %t to i32
60         br label %F
61
62 F:
63         %V = phi i32 [%t2, %T], [42, %entry]
64         %W = trunc i32 %V to i16
65         ret i16 %W
66 }
67
68 ; PR2638
69 define i32 @test2(i32 %i) nounwind  {
70 entry:
71         %tmp12 = trunc i32 %i to i8             ; <i8> [#uses=1]
72         %tmp16 = shl i8 %tmp12, 6               ; <i8> [#uses=1]
73         %a = ashr i8 %tmp16, 6            ; <i8> [#uses=1]
74         %b = sext i8 %a to i32            ; <i32> [#uses=1]
75         ret i32 %b
76 }
77