Modify two Transforms tests to explicitly check for full function names in some cases...
[oota-llvm.git] / test / Transforms / ScalarRepl / phi-select.ll
1 ; RUN: opt -scalarrepl -S < %s | FileCheck %s
2 ; Test promotion of allocas that have phis and select users.
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-n8:16:32:64"
4 target triple = "x86_64-apple-darwin10.2"
5
6 %struct.X = type { i32 }
7 %PairTy = type {i32, i32}
8
9 ; CHECK: @test1
10 ; CHECK: %a.0 = alloca i32
11 ; CHECK: %b.0 = alloca i32
12 define i32 @test1(i32 %x) nounwind readnone ssp {
13 entry:
14   %a = alloca %struct.X, align 8                  ; <%struct.X*> [#uses=2]
15   %b = alloca %struct.X, align 8                  ; <%struct.X*> [#uses=2]
16   %0 = getelementptr inbounds %struct.X* %a, i64 0, i32 0 ; <i32*> [#uses=1]
17   store i32 1, i32* %0, align 8
18   %1 = getelementptr inbounds %struct.X* %b, i64 0, i32 0 ; <i32*> [#uses=1]
19   store i32 2, i32* %1, align 8
20   %2 = icmp eq i32 %x, 0                          ; <i1> [#uses=1]
21   %p.0 = select i1 %2, %struct.X* %b, %struct.X* %a ; <%struct.X*> [#uses=1]
22   %3 = getelementptr inbounds %struct.X* %p.0, i64 0, i32 0 ; <i32*> [#uses=1]
23   %4 = load i32* %3, align 8                      ; <i32> [#uses=1]
24   ret i32 %4
25 }
26
27 ; CHECK: @test2
28 ; CHECK: %X.ld = phi i32 [ 1, %entry ], [ 2, %T ]
29 ; CHECK-NEXT: ret i32 %X.ld
30 define i32 @test2(i1 %c) {
31 entry:
32   %A = alloca {i32, i32}
33   %B = getelementptr {i32, i32}* %A, i32 0, i32 0
34   store i32 1, i32* %B
35   br i1 %c, label %T, label %F
36 T:
37   %C = getelementptr {i32, i32}* %A, i32 0, i32 1
38   store i32 2, i32* %C
39   br label %F
40 F:
41   %X = phi i32* [%B, %entry], [%C, %T]
42   %Q = load i32* %X
43   ret i32 %Q
44 }
45
46 ; CHECK: @test3
47 ; CHECK-NEXT: %Q = select i1 %c, i32 1, i32 2
48 ; CHECK-NEXT: ret i32 %Q
49 ; rdar://8904039
50 define i32 @test3(i1 %c) {
51   %A = alloca {i32, i32}
52   %B = getelementptr {i32, i32}* %A, i32 0, i32 0
53   store i32 1, i32* %B
54   %C = getelementptr {i32, i32}* %A, i32 0, i32 1
55   store i32 2, i32* %C
56   
57   %X = select i1 %c, i32* %B, i32* %C
58   %Q = load i32* %X
59   ret i32 %Q
60 }
61
62 ;; We can't scalarize this, a use of the select is not an element access.
63 define i64 @test4(i1 %c) {
64 entry:
65   %A = alloca %PairTy
66   ; CHECK: @test4
67   ; CHECK: %A = alloca %PairTy
68   %B = getelementptr %PairTy* %A, i32 0, i32 0
69   store i32 1, i32* %B
70   %C = getelementptr %PairTy* %A, i32 0, i32 1
71   store i32 2, i32* %B
72   
73   %X = select i1 %c, i32* %B, i32* %C
74   %Y = bitcast i32* %X to i64*
75   %Q = load i64* %Y
76   ret i64 %Q
77 }
78
79
80 ;;
81 ;; Tests for promoting allocas used by selects.
82 ;; rdar://7339113
83 ;;
84
85 define i32 @test5(i32 *%P) nounwind readnone ssp {
86 entry:
87   %b = alloca i32, align 8 
88   store i32 2, i32* %b, align 8
89   
90   ;; Select on constant condition should be folded.
91   %p.0 = select i1 false, i32* %b, i32* %P
92   store i32 123, i32* %p.0
93   
94   %r = load i32* %b, align 8
95   ret i32 %r
96   
97 ; CHECK: @test5
98 ; CHECK: store i32 123, i32* %P
99 ; CHECK: ret i32 2
100 }
101
102 define i32 @test6(i32 %x, i1 %c) nounwind readnone ssp {
103   %a = alloca i32, align 8
104   %b = alloca i32, align 8
105   store i32 1, i32* %a, align 8
106   store i32 2, i32* %b, align 8
107   %p.0 = select i1 %c, i32* %b, i32* %a
108   %r = load i32* %p.0, align 8
109   ret i32 %r
110 ; CHECK: @test6
111 ; CHECK-NEXT: %r = select i1 %c, i32 2, i32 1
112 ; CHECK-NEXT: ret i32 %r
113 }
114
115 ; Verify that the loads happen where the loads are, not where the select is.
116 define i32 @test7(i32 %x, i1 %c) nounwind readnone ssp {
117   %a = alloca i32, align 8
118   %b = alloca i32, align 8
119   store i32 1, i32* %a
120   store i32 2, i32* %b
121   %p.0 = select i1 %c, i32* %b, i32* %a
122   
123   store i32 0, i32* %a
124   
125   %r = load i32* %p.0, align 8
126   ret i32 %r
127 ; CHECK: @test7
128 ; CHECK-NOT: alloca i32
129 ; CHECK: %r = select i1 %c, i32 2, i32 0
130 ; CHECK: ret i32 %r
131 }
132
133 ;; Promote allocs that are PHI'd together by moving the loads.
134 define i32 @test8(i32 %x) nounwind readnone ssp {
135 ; CHECK: @test8
136 ; CHECK-NOT: load i32
137 ; CHECK-NOT: store i32
138 ; CHECK: %p.0.ld = phi i32 [ 2, %entry ], [ 1, %T ]
139 ; CHECK-NEXT: ret i32 %p.0.ld
140 entry:
141   %a = alloca i32, align 8
142   %b = alloca i32, align 8
143   store i32 1, i32* %a, align 8
144   store i32 2, i32* %b, align 8
145   %c = icmp eq i32 %x, 0 
146   br i1 %c, label %T, label %Cont
147 T:
148   br label %Cont
149 Cont:
150   %p.0 = phi i32* [%b, %entry],[%a, %T]
151   %r = load i32* %p.0, align 8
152   ret i32 %r
153 }