1; RUN: opt < %s -instcombine -S | FileCheck %s
2
3define 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-LABEL: @test1(
9; CHECK-NEXT: store i32 123, i32* undef
10; CHECK-NEXT: store i32 undef, i32* null
11; CHECK-NEXT: ret void
12}
13
14define void @test2(i32* %P) {
15        %X = load i32* %P               ; <i32> [#uses=1]
16        %Y = add i32 %X, 0              ; <i32> [#uses=1]
17        store i32 %Y, i32* %P
18        ret void
19; CHECK-LABEL: @test2(
20; CHECK-NEXT: ret void
21}
22
23;; Simple sinking tests
24
25; "if then else"
26define i32 @test3(i1 %C) {
27	%A = alloca i32
28        br i1 %C, label %Cond, label %Cond2
29
30Cond:
31        store i32 -987654321, i32* %A
32        br label %Cont
33
34Cond2:
35	store i32 47, i32* %A
36	br label %Cont
37
38Cont:
39	%V = load i32* %A
40	ret i32 %V
41; CHECK-LABEL: @test3(
42; CHECK-NOT: alloca
43; CHECK: Cont:
44; CHECK-NEXT:  %storemerge = phi i32 [ 47, %Cond2 ], [ -987654321, %Cond ]
45; CHECK-NEXT:  ret i32 %storemerge
46}
47
48; "if then"
49define i32 @test4(i1 %C) {
50	%A = alloca i32
51	store i32 47, i32* %A
52        br i1 %C, label %Cond, label %Cont
53
54Cond:
55        store i32 -987654321, i32* %A
56        br label %Cont
57
58Cont:
59	%V = load i32* %A
60	ret i32 %V
61; CHECK-LABEL: @test4(
62; CHECK-NOT: alloca
63; CHECK: Cont:
64; CHECK-NEXT:  %storemerge = phi i32 [ -987654321, %Cond ], [ 47, %0 ]
65; CHECK-NEXT:  ret i32 %storemerge
66}
67
68; "if then"
69define void @test5(i1 %C, i32* %P) {
70	store i32 47, i32* %P, align 1
71        br i1 %C, label %Cond, label %Cont
72
73Cond:
74        store i32 -987654321, i32* %P, align 1
75        br label %Cont
76
77Cont:
78	ret void
79; CHECK-LABEL: @test5(
80; CHECK: Cont:
81; CHECK-NEXT:  %storemerge = phi i32
82; CHECK-NEXT:  store i32 %storemerge, i32* %P, align 1
83; CHECK-NEXT:  ret void
84}
85
86
87; PR14753 - merging two stores should preserve the TBAA tag.
88define void @test6(i32 %n, float* %a, i32* %gi) nounwind uwtable ssp {
89entry:
90  store i32 42, i32* %gi, align 4, !tbaa !0
91  br label %for.cond
92
93for.cond:                                         ; preds = %for.body, %entry
94  %storemerge = phi i32 [ 0, %entry ], [ %inc, %for.body ]
95  %0 = load i32* %gi, align 4, !tbaa !0
96  %cmp = icmp slt i32 %0, %n
97  br i1 %cmp, label %for.body, label %for.end
98
99for.body:                                         ; preds = %for.cond
100  %idxprom = sext i32 %0 to i64
101  %arrayidx = getelementptr inbounds float* %a, i64 %idxprom
102  store float 0.000000e+00, float* %arrayidx, align 4, !tbaa !3
103  %1 = load i32* %gi, align 4, !tbaa !0
104  %inc = add nsw i32 %1, 1
105  store i32 %inc, i32* %gi, align 4, !tbaa !0
106  br label %for.cond
107
108for.end:                                          ; preds = %for.cond
109  ret void
110; CHECK-LABEL: @test6(
111; CHECK: for.cond:
112; CHECK-NEXT: phi i32 [ 42
113; CHECK-NEXT: store i32 %storemerge, i32* %gi, align 4, !tbaa !0
114}
115
116!0 = metadata !{metadata !4, metadata !4, i64 0}
117!1 = metadata !{metadata !"omnipotent char", metadata !2}
118!2 = metadata !{metadata !"Simple C/C++ TBAA"}
119!3 = metadata !{metadata !"float", metadata !1}
120!4 = metadata !{metadata !"int", metadata !1}
121