1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -basic-aa -dse -S | FileCheck %s
3
4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5
6define void @second_store_smaller_1(i32* noalias %P, i1 %c) {
7; CHECK-LABEL: @second_store_smaller_1(
8; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
9; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
10; CHECK:       bb1:
11; CHECK-NEXT:    br label [[BB3:%.*]]
12; CHECK:       bb2:
13; CHECK-NEXT:    br label [[BB3]]
14; CHECK:       bb3:
15; CHECK-NEXT:    ret void
16;
17  store i32 1, i32* %P
18  br i1 %c, label %bb1, label %bb2
19bb1:
20  br label %bb3
21bb2:
22  br label %bb3
23bb3:
24  %P.i16 = bitcast i32* %P to i16*
25  store i16 0, i16* %P.i16
26  ret void
27}
28
29define void @second_store_smaller_2(i32* noalias %P, i1 %c) {
30; CHECK-LABEL: @second_store_smaller_2(
31; CHECK-NEXT:    store i32 12345, i32* [[P:%.*]], align 4
32; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
33; CHECK:       bb1:
34; CHECK-NEXT:    br label [[BB3:%.*]]
35; CHECK:       bb2:
36; CHECK-NEXT:    br label [[BB3]]
37; CHECK:       bb3:
38; CHECK-NEXT:    ret void
39;
40  store i32 1, i32* %P
41  br i1 %c, label %bb1, label %bb2
42bb1:
43  br label %bb3
44bb2:
45  br label %bb3
46bb3:
47  %P.i16 = bitcast i32* %P to i16*
48  store i16 12345, i16* %P.i16
49  ret void
50}
51
52declare void @use(i16) readnone
53declare void @use.i8(i8) readnone
54
55define void @second_store_smaller_3(i32* noalias %P, i1 %c) {
56; CHECK-LABEL: @second_store_smaller_3(
57; CHECK-NEXT:    store i32 1, i32* [[P:%.*]], align 4
58; CHECK-NEXT:    [[P_I16:%.*]] = bitcast i32* [[P]] to i16*
59; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
60; CHECK:       bb1:
61; CHECK-NEXT:    [[L1:%.*]] = load i16, i16* [[P_I16]], align 2
62; CHECK-NEXT:    call void @use(i16 [[L1]])
63; CHECK-NEXT:    br label [[BB3:%.*]]
64; CHECK:       bb2:
65; CHECK-NEXT:    br label [[BB3]]
66; CHECK:       bb3:
67; CHECK-NEXT:    store i16 -31073, i16* [[P_I16]], align 2
68; CHECK-NEXT:    ret void
69;
70  store i32 1, i32* %P
71  %P.i16 = bitcast i32* %P to i16*
72  br i1 %c, label %bb1, label %bb2
73
74bb1:
75  %l1 = load i16, i16* %P.i16
76  call void @use(i16 %l1)
77  br label %bb3
78bb2:
79  br label %bb3
80bb3:
81  store i16 -31073, i16* %P.i16
82  ret void
83}
84
85define void @second_store_smaller_4(i32* noalias %P, i1 %c) {
86; CHECK-LABEL: @second_store_smaller_4(
87; CHECK-NEXT:    store i32 1, i32* [[P:%.*]], align 4
88; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
89; CHECK:       bb1:
90; CHECK-NEXT:    [[P_I8:%.*]] = bitcast i32* [[P]] to i8*
91; CHECK-NEXT:    [[L1:%.*]] = load i8, i8* [[P_I8]], align 1
92; CHECK-NEXT:    call void @use.i8(i8 [[L1]])
93; CHECK-NEXT:    br label [[BB3:%.*]]
94; CHECK:       bb2:
95; CHECK-NEXT:    br label [[BB3]]
96; CHECK:       bb3:
97; CHECK-NEXT:    [[P_I16:%.*]] = bitcast i32* [[P]] to i16*
98; CHECK-NEXT:    store i16 -31073, i16* [[P_I16]], align 2
99; CHECK-NEXT:    ret void
100;
101  store i32 1, i32* %P
102  br i1 %c, label %bb1, label %bb2
103
104bb1:
105  %P.i8 = bitcast i32* %P to i8*
106  %l1 = load i8, i8* %P.i8
107  call void @use.i8(i8 %l1)
108  br label %bb3
109bb2:
110  br label %bb3
111bb3:
112  %P.i16 = bitcast i32* %P to i16*
113  store i16 -31073, i16* %P.i16
114  ret void
115}
116
117define void @second_store_smaller_5(i32* noalias %P, i16 %x, i1 %c) {
118; CHECK-LABEL: @second_store_smaller_5(
119; CHECK-NEXT:    store i32 1, i32* [[P:%.*]], align 4
120; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
121; CHECK:       bb1:
122; CHECK-NEXT:    br label [[BB3:%.*]]
123; CHECK:       bb2:
124; CHECK-NEXT:    br label [[BB3]]
125; CHECK:       bb3:
126; CHECK-NEXT:    [[P_I16:%.*]] = bitcast i32* [[P]] to i16*
127; CHECK-NEXT:    store i16 [[X:%.*]], i16* [[P_I16]], align 2
128; CHECK-NEXT:    ret void
129;
130  store i32 1, i32* %P
131  br i1 %c, label %bb1, label %bb2
132bb1:
133  br label %bb3
134bb2:
135  br label %bb3
136bb3:
137  %P.i16 = bitcast i32* %P to i16*
138  store i16 %x, i16* %P.i16
139  ret void
140}
141
142define void @second_store_bigger(i32* noalias %P, i1 %c) {
143; CHECK-LABEL: @second_store_bigger(
144; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
145; CHECK:       bb1:
146; CHECK-NEXT:    br label [[BB3:%.*]]
147; CHECK:       bb2:
148; CHECK-NEXT:    br label [[BB3]]
149; CHECK:       bb3:
150; CHECK-NEXT:    [[P_I64:%.*]] = bitcast i32* [[P:%.*]] to i64*
151; CHECK-NEXT:    store i64 0, i64* [[P_I64]], align 8
152; CHECK-NEXT:    ret void
153;
154  store i32 1, i32* %P
155  br i1 %c, label %bb1, label %bb2
156bb1:
157  br label %bb3
158bb2:
159  br label %bb3
160bb3:
161  %P.i64 = bitcast i32* %P to i64*
162  store i64 0, i64* %P.i64
163  ret void
164}
165