1; RUN: opt < %s  -instcombine  -S | FileCheck %s
2
3define void @test1(float* %a, float* readnone %a_end, i64* %b.i64) {
4; CHECK-LABEL: @test1
5entry:
6  %cmp1 = icmp ult float* %a, %a_end
7  br i1 %cmp1, label %for.body.preheader, label %for.end
8
9for.body.preheader:                               ; preds = %entry
10  %b = load i64, i64* %b.i64, align 8
11; CHECK: load float*, float**
12  br label %for.body
13
14for.body:                                         ; preds = %for.body, %for.body.preheader
15  %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
16  %b.addr.02 = phi i64 [ %add.int, %for.body ], [ %b, %for.body.preheader ]
17
18; CHECK: %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
19; CHECK: %b.addr.02.ptr = phi float* [ %add, %for.body ],
20; CHECK-NOT: %b.addr.02 = phi i64
21
22  %tmp = inttoptr i64 %b.addr.02 to float*
23; CHECK-NOT: inttoptr i64
24  %tmp1 = load float, float* %tmp, align 4
25; CHECK: = load
26  %mul.i = fmul float %tmp1, 4.200000e+01
27  store float %mul.i, float* %a.addr.03, align 4
28  %add = getelementptr inbounds float, float* %tmp, i64 1
29  %add.int = ptrtoint float* %add to i64
30; CHECK %add = getelementptr
31; CHECK-NOT: ptrtoint float*
32  %incdec.ptr = getelementptr inbounds float, float* %a.addr.03, i64 1
33; CHECK: %incdec.ptr =
34  %cmp = icmp ult float* %incdec.ptr, %a_end
35  br i1 %cmp, label %for.body, label %for.end
36
37for.end:                                          ; preds = %for.body, %entry
38  ret void
39}
40
41define void @test1_neg(float* %a, float* readnone %a_end, i64* %b.i64) {
42; CHECK-LABEL: @test1_neg
43entry:
44  %cmp1 = icmp ult float* %a, %a_end
45  br i1 %cmp1, label %for.body.preheader, label %for.end
46
47for.body.preheader:                               ; preds = %entry
48  %b = load i64, i64* %b.i64, align 8
49  br label %for.body
50
51for.body:                                         ; preds = %for.body, %for.body.preheader
52  %a.addr.03 = phi float* [ %incdec.ptr, %bb ], [ %a, %for.body.preheader ]
53  %b.addr.02 = phi i64 [ %add.int, %bb ], [ %b, %for.body.preheader ]
54
55; CHECK: %a.addr.03 = phi float* [ %incdec.ptr, %bb ], [ %a, %for.body.preheader ]
56; CHECK: %b.addr.02 = phi i64
57
58  %tmp = inttoptr i64 %b.addr.02 to float*
59; CHECK: inttoptr i64
60  %ptrcmp = icmp ult float* %tmp, %a_end
61  br i1 %ptrcmp, label %for.end, label %bb
62
63bb:
64  %tmp1 = load float, float* %a, align 4
65  %mul.i = fmul float %tmp1, 4.200000e+01
66  store float %mul.i, float* %a.addr.03, align 4
67  %add = getelementptr inbounds float, float* %a, i64 1
68  %add.int = ptrtoint float* %add to i64
69; CHECK: ptrtoint float*
70  %incdec.ptr = getelementptr inbounds float, float* %a.addr.03, i64 1
71  %cmp = icmp ult float* %incdec.ptr, %a_end
72  br i1 %cmp, label %for.body, label %for.end
73
74for.end:                                          ; preds = %for.body, %entry
75  ret void
76}
77
78
79define void @test2(float* %a, float* readnone %a_end, float** %b.float) {
80; CHECK-LABEL: @test2
81entry:
82  %cmp1 = icmp ult float* %a, %a_end
83  br i1 %cmp1, label %for.body.preheader, label %for.end
84
85for.body.preheader:                               ; preds = %entry
86  %b.i64 = bitcast float** %b.float to i64*
87  %b = load i64, i64* %b.i64, align 8
88; CHECK: load float*, float**
89  br label %for.body
90
91for.body:                                         ; preds = %for.body, %for.body.preheader
92  %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
93  %b.addr.02 = phi i64 [ %add.int, %for.body ], [ %b, %for.body.preheader ]
94
95; CHECK: %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
96; CHECK: %b.addr.02.ptr = phi float* [ %add, %for.body ],
97; CHECK-NOT: %b.addr.02 = phi i64
98
99  %tmp = inttoptr i64 %b.addr.02 to float*
100; CHECK-NOT: inttoptr i64
101  %tmp1 = load float, float* %tmp, align 4
102; CHECK: = load
103  %mul.i = fmul float %tmp1, 4.200000e+01
104  store float %mul.i, float* %a.addr.03, align 4
105  %add = getelementptr inbounds float, float* %tmp, i64 1
106; CHECK: %add =
107  %add.int = ptrtoint float* %add to i64
108; CHECK-NOT: ptrtoint float*
109  %incdec.ptr = getelementptr inbounds float, float* %a.addr.03, i64 1
110; CHECK: %incdec.ptr =
111  %cmp = icmp ult float* %incdec.ptr, %a_end
112  br i1 %cmp, label %for.body, label %for.end
113
114for.end:                                          ; preds = %for.body, %entry
115  ret void
116}
117
118
119define void @test3(float* %a, float* readnone %a_end, i8** %b.i8p) {
120; CHECK-LABEL: @test3
121entry:
122  %cmp1 = icmp ult float* %a, %a_end
123  br i1 %cmp1, label %for.body.preheader, label %for.end
124
125for.body.preheader:                               ; preds = %entry
126  %b.i64 = bitcast i8** %b.i8p to i64*
127  %b = load i64, i64* %b.i64, align 8
128; CHECK: load float*, float**
129  br label %for.body
130
131for.body:                                         ; preds = %for.body, %for.body.preheader
132  %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
133  %b.addr.02 = phi i64 [ %add.int, %for.body ], [ %b, %for.body.preheader ]
134
135; CHECK: %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
136; CHECK: %b.addr.02.ptr = phi float* [ %add, %for.body ],
137; CHECK-NOT: %b.addr.02 = phi i64
138
139  %tmp = inttoptr i64 %b.addr.02 to float*
140; CHECK-NOT: inttoptr i64
141  %tmp1 = load float, float* %tmp, align 4
142; CHECK: = load
143  %mul.i = fmul float %tmp1, 4.200000e+01
144  store float %mul.i, float* %a.addr.03, align 4
145  %add = getelementptr inbounds float, float* %tmp, i64 1
146; CHECK: %add = getelementptr
147  %add.int = ptrtoint float* %add to i64
148; CHECK-NOT: ptrtoint float*
149  %incdec.ptr = getelementptr inbounds float, float* %a.addr.03, i64 1
150; CHECK: %incdec.ptr =
151  %cmp = icmp ult float* %incdec.ptr, %a_end
152  br i1 %cmp, label %for.body, label %for.end
153
154for.end:                                          ; preds = %for.body, %entry
155  ret void
156}
157
158
159define void @test4(float* %a, float* readnone %a_end, float** %b.float) {
160entry:
161; CHECK-LABEL: @test4
162  %cmp1 = icmp ult float* %a, %a_end
163  br i1 %cmp1, label %for.body.preheader, label %for.end
164
165for.body.preheader:                               ; preds = %entry
166  %b.f = load float*, float** %b.float, align 8
167  %b = ptrtoint float* %b.f to i64
168; CHECK: load float*, float**
169; CHECK-NOT: ptrtoint float*
170  br label %for.body
171; CHECK: br label %for.body
172
173for.body:                                         ; preds = %for.body, %for.body.preheader
174  %a.addr.03 = phi float* [ %incdec.ptr, %for.body ], [ %a, %for.body.preheader ]
175  %b.addr.02 = phi i64 [ %add.int, %for.body ], [ %b, %for.body.preheader ]
176  %tmp = inttoptr i64 %b.addr.02 to float*
177; CHECK-NOT: inttoptr i64
178  %tmp1 = load float, float* %tmp, align 4
179; CHECK: = load
180  %mul.i = fmul float %tmp1, 4.200000e+01
181  store float %mul.i, float* %a.addr.03, align 4
182  %add = getelementptr inbounds float, float* %tmp, i64 1
183; CHECK: %add =
184  %add.int = ptrtoint float* %add to i64
185; CHECK-NOT: ptrtoint float*
186  %incdec.ptr = getelementptr inbounds float, float* %a.addr.03, i64 1
187; CHECK: %incdec.ptr =
188  %cmp = icmp ult float* %incdec.ptr, %a_end
189  br i1 %cmp, label %for.body, label %for.end
190
191for.end:                                          ; preds = %for.body, %entry
192  ret void
193}
194