fix instcombine to only do store sinking when the alignments
[oota-llvm.git] / test / Transforms / InstCombine / store.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 define void @test1(i32* %P) {
4         store i32 undef, i32* %P
5         store i32 123, i32* undef
6         store i32 124, i32* null
7         ret void
8 ; CHECK: @test1(
9 ; CHECK-NEXT: store i32 undef, i32* null
10 ; CHECK-NEXT: ret void
11 }
12
13 define void @test2(i32* %P) {
14         %X = load i32* %P               ; <i32> [#uses=1]
15         %Y = add i32 %X, 0              ; <i32> [#uses=1]
16         store i32 %Y, i32* %P
17         ret void
18 ; CHECK: @test2
19 ; CHECK-NEXT: ret void
20 }
21
22 ;; Simple sinking tests
23
24 ; "if then else"
25 define i32 @test3(i1 %C) {
26         %A = alloca i32
27         br i1 %C, label %Cond, label %Cond2
28
29 Cond:
30         store i32 -987654321, i32* %A
31         br label %Cont
32
33 Cond2:
34         store i32 47, i32* %A
35         br label %Cont
36
37 Cont:
38         %V = load i32* %A
39         ret i32 %V
40 ; CHECK: @test3
41 ; CHECK-NOT: alloca
42 ; CHECK: Cont:
43 ; CHECK-NEXT:  %storemerge = phi i32 [ 47, %Cond2 ], [ -987654321, %Cond ]
44 ; CHECK-NEXT:  ret i32 %storemerge
45 }
46
47 ; "if then"
48 define i32 @test4(i1 %C) {
49         %A = alloca i32
50         store i32 47, i32* %A
51         br i1 %C, label %Cond, label %Cont
52
53 Cond:
54         store i32 -987654321, i32* %A
55         br label %Cont
56
57 Cont:
58         %V = load i32* %A
59         ret i32 %V
60 ; CHECK: @test4
61 ; CHECK-NOT: alloca
62 ; CHECK: Cont:
63 ; CHECK-NEXT:  %storemerge = phi i32 [ -987654321, %Cond ], [ 47, %0 ]
64 ; CHECK-NEXT:  ret i32 %storemerge
65 }
66
67 ; "if then"
68 define void @test5(i1 %C, i32* %P) {
69         store i32 47, i32* %P, align 1
70         br i1 %C, label %Cond, label %Cont
71
72 Cond:
73         store i32 -987654321, i32* %P, align 1
74         br label %Cont
75
76 Cont:
77         ret void
78 ; CHECK: @test5
79 ; CHECK: Cont:
80 ; CHECK-NEXT:  %storemerge = phi i32
81 ; CHECK-NEXT:  store i32 %storemerge, i32* %P, align 1
82 ; CHECK-NEXT:  ret void
83 }
84