blob: 06ee2081513b03243c47de90b93f8420b795e517 [file] [log] [blame]
Chris Lattner145c5322011-01-23 08:27:54 +00001; RUN: opt %s -scalarrepl -S | FileCheck %s
2; Test promotion of allocas that have phis and select users.
3target 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"
4target 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
12define i32 @test1(i32 %x) nounwind readnone ssp {
13entry:
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: %A.0 = alloca i32
29; CHECK: %A.1 = alloca i32
30define i32 @test2(i1 %c) {
31entry:
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
36T:
37 %C = getelementptr {i32, i32}* %A, i32 0, i32 1
38 store i32 2, i32* %B
39 br label %F
40F:
41 %X = phi i32* [%B, %entry], [%C, %T]
42 %Q = load i32* %X
43 ret i32 %Q
44}
45
46; CHECK: @test3
47; CHECK: %A.0 = alloca i32
48; CHECK: %A.1 = alloca i32
49; rdar://8904039
50define i32 @test3(i1 %c) {
51entry:
52 %A = alloca {i32, i32}
53 %B = getelementptr {i32, i32}* %A, i32 0, i32 0
54 store i32 1, i32* %B
55 %C = getelementptr {i32, i32}* %A, i32 0, i32 1
56 store i32 2, i32* %B
57
58 %X = select i1 %c, i32* %B, i32* %C
59 %Q = load i32* %X
60 ret i32 %Q
61}
62
63;; We can't scalarize this, a use of the select is not an element access.
64define i64 @test4(i1 %c) {
65entry:
66 %A = alloca %PairTy
67 ; CHECK: @test4
68 ; CHECK: %A = alloca %PairTy
69 %B = getelementptr {i32, i32}* %A, i32 0, i32 0
70 store i32 1, i32* %B
71 %C = getelementptr {i32, i32}* %A, i32 0, i32 1
72 store i32 2, i32* %B
73
74 %X = select i1 %c, i32* %B, i32* %C
75 %Y = bitcast i32* %X to i64*
76 %Q = load i64* %Y
77 ret i64 %Q
78}