1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5
2
2
; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s
3
3
4
- define float @fmax_ugt_with_select_1 (ptr %src , i64 %n ) {
5
- ; CHECK-LABEL: define float @fmax_ugt_with_select_1 (
4
+ define float @fmax_ogt_with_select_1 (ptr %src , i64 %n ) {
5
+ ; CHECK-LABEL: define float @fmax_ogt_with_select_1 (
6
6
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
7
7
; CHECK-NEXT: [[ENTRY:.*]]:
8
8
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -11,7 +11,7 @@ define float @fmax_ugt_with_select_1(ptr %src, i64 %n) {
11
11
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
12
12
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
13
13
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
14
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[L]], [[MAX]]
14
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[L]], [[MAX]]
15
15
; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L]], float [[MAX]]
16
16
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
17
17
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
28
28
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
29
29
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
30
30
%l = load float , ptr %gep.src , align 4
31
- %cmp = fcmp ugt float %l , %max
31
+ %cmp = fcmp ogt float %l , %max
32
32
%max.next = select i1 %cmp , float %l , float %max
33
33
%iv.next = add nuw nsw i64 %iv , 1
34
34
%ec = icmp eq i64 %iv.next , %n
38
38
ret float %max.next
39
39
}
40
40
41
- define float @fmax_ugt_with_select_2 (ptr %src , i64 %n ) {
42
- ; CHECK-LABEL: define float @fmax_ugt_with_select_2 (
41
+ define float @fmax_ogt_with_select_2 (ptr %src , i64 %n ) {
42
+ ; CHECK-LABEL: define float @fmax_ogt_with_select_2 (
43
43
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
44
44
; CHECK-NEXT: [[ENTRY:.*]]:
45
45
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -48,7 +48,7 @@ define float @fmax_ugt_with_select_2(ptr %src, i64 %n) {
48
48
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
49
49
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
50
50
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
51
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[MAX]], [[L]]
51
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[MAX]], [[L]]
52
52
; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[MAX]], float [[L]]
53
53
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
54
54
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
65
65
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
66
66
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
67
67
%l = load float , ptr %gep.src , align 4
68
- %cmp = fcmp ugt float %max , %l
68
+ %cmp = fcmp ogt float %max , %l
69
69
%max.next = select i1 %cmp , float %max , float %l
70
70
%iv.next = add nuw nsw i64 %iv , 1
71
71
%ec = icmp eq i64 %iv.next , %n
75
75
ret float %max.next
76
76
}
77
77
78
- define float @fmax_ogt_with_select_1 (ptr %src , i64 %n ) {
79
- ; CHECK-LABEL: define float @fmax_ogt_with_select_1 (
78
+ define float @fmax_olt_with_select_1 (ptr %src , i64 %n ) {
79
+ ; CHECK-LABEL: define float @fmax_olt_with_select_1 (
80
80
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
81
81
; CHECK-NEXT: [[ENTRY:.*]]:
82
82
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -85,8 +85,8 @@ define float @fmax_ogt_with_select_1(ptr %src, i64 %n) {
85
85
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
86
86
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
87
87
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
88
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[L]], [[MAX]]
89
- ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L ]], float [[MAX ]]
88
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[L]], [[MAX]]
89
+ ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[MAX ]], float [[L ]]
90
90
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
91
91
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
92
92
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
@@ -102,8 +102,8 @@ loop:
102
102
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
103
103
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
104
104
%l = load float , ptr %gep.src , align 4
105
- %cmp = fcmp ogt float %l , %max
106
- %max.next = select i1 %cmp , float %l , float %max
105
+ %cmp = fcmp olt float %l , %max
106
+ %max.next = select i1 %cmp , float %max , float %l
107
107
%iv.next = add nuw nsw i64 %iv , 1
108
108
%ec = icmp eq i64 %iv.next , %n
109
109
br i1 %ec , label %exit , label %loop
@@ -112,8 +112,8 @@ exit:
112
112
ret float %max.next
113
113
}
114
114
115
- define float @fmax_ogt_with_select_2 (ptr %src , i64 %n ) {
116
- ; CHECK-LABEL: define float @fmax_ogt_with_select_2 (
115
+ define float @fmax_olt_with_select_2 (ptr %src , i64 %n ) {
116
+ ; CHECK-LABEL: define float @fmax_olt_with_select_2 (
117
117
; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
118
118
; CHECK-NEXT: [[ENTRY:.*]]:
119
119
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -122,8 +122,8 @@ define float @fmax_ogt_with_select_2(ptr %src, i64 %n) {
122
122
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
123
123
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
124
124
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
125
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[MAX]], [[L]]
126
- ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[MAX ]], float [[L ]]
125
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[MAX]], [[L]]
126
+ ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L ]], float [[MAX ]]
127
127
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
128
128
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
129
129
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
@@ -139,8 +139,8 @@ loop:
139
139
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
140
140
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
141
141
%l = load float , ptr %gep.src , align 4
142
- %cmp = fcmp ogt float %max , %l
143
- %max.next = select i1 %cmp , float %max , float %l
142
+ %cmp = fcmp olt float %max , %l
143
+ %max.next = select i1 %cmp , float %l , float %max
144
144
%iv.next = add nuw nsw i64 %iv , 1
145
145
%ec = icmp eq i64 %iv.next , %n
146
146
br i1 %ec , label %exit , label %loop
@@ -149,8 +149,8 @@ exit:
149
149
ret float %max.next
150
150
}
151
151
152
- define float @fmax_ugt_with_select_store_result (ptr %src , ptr %dst , i64 %n ) {
153
- ; CHECK-LABEL: define float @fmax_ugt_with_select_store_result (
152
+ define float @fmax_ogt_with_select_store_result (ptr %src , ptr %dst , i64 %n ) {
153
+ ; CHECK-LABEL: define float @fmax_ogt_with_select_store_result (
154
154
; CHECK-SAME: ptr [[SRC:%.*]], ptr [[DST:%.*]], i64 [[N:%.*]]) {
155
155
; CHECK-NEXT: [[ENTRY:.*]]:
156
156
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -159,7 +159,7 @@ define float @fmax_ugt_with_select_store_result(ptr %src, ptr %dst, i64 %n) {
159
159
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
160
160
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
161
161
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
162
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[L]], [[MAX]]
162
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[L]], [[MAX]]
163
163
; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L]], float [[MAX]]
164
164
; CHECK-NEXT: store float [[MAX_NEXT]], ptr [[DST]], align 8
165
165
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
@@ -177,7 +177,7 @@ loop:
177
177
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
178
178
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
179
179
%l = load float , ptr %gep.src , align 4
180
- %cmp = fcmp ugt float %l , %max
180
+ %cmp = fcmp ogt float %l , %max
181
181
%max.next = select i1 %cmp , float %l , float %max
182
182
store float %max.next , ptr %dst , align 8
183
183
%iv.next = add nuw nsw i64 %iv , 1
@@ -323,7 +323,7 @@ define float @fmax_with_select_and_load_store(ptr %src, ptr noalias %dst, i64 %n
323
323
; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
324
324
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
325
325
; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
326
- ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[L]], [[MAX]]
326
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[L]], [[MAX]]
327
327
; CHECK-NEXT: [[IV_1:%.*]] = add i64 [[IV]], 1
328
328
; CHECK-NEXT: [[GEP_DST_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 [[IV_1]]
329
329
; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[GEP_DST_1]], align 4
@@ -345,7 +345,7 @@ loop:
345
345
%max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
346
346
%gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
347
347
%l = load float , ptr %gep.src , align 4
348
- %cmp = fcmp ugt float %l , %max
348
+ %cmp = fcmp ogt float %l , %max
349
349
%iv.1 = add i64 %iv , 1
350
350
%gep.dst.1 = getelementptr inbounds i32 , ptr %dst , i64 %iv.1
351
351
%l.2 = load i32 , ptr %gep.dst.1
@@ -359,3 +359,77 @@ loop:
359
359
exit:
360
360
ret float %max.next
361
361
}
362
+
363
+ define float @fmax_ugt_with_select_1 (ptr %src , i64 %n ) {
364
+ ; CHECK-LABEL: define float @fmax_ugt_with_select_1(
365
+ ; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
366
+ ; CHECK-NEXT: [[ENTRY:.*]]:
367
+ ; CHECK-NEXT: br label %[[LOOP:.*]]
368
+ ; CHECK: [[LOOP]]:
369
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
370
+ ; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
371
+ ; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
372
+ ; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
373
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[L]], [[MAX]]
374
+ ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L]], float [[MAX]]
375
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
376
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
377
+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
378
+ ; CHECK: [[EXIT]]:
379
+ ; CHECK-NEXT: [[MAX_NEXT_LCSSA:%.*]] = phi float [ [[MAX_NEXT]], %[[LOOP]] ]
380
+ ; CHECK-NEXT: ret float [[MAX_NEXT_LCSSA]]
381
+ ;
382
+ entry:
383
+ br label %loop
384
+
385
+ loop:
386
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
387
+ %max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
388
+ %gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
389
+ %l = load float , ptr %gep.src , align 4
390
+ %cmp = fcmp ugt float %l , %max
391
+ %max.next = select i1 %cmp , float %l , float %max
392
+ %iv.next = add nuw nsw i64 %iv , 1
393
+ %ec = icmp eq i64 %iv.next , %n
394
+ br i1 %ec , label %exit , label %loop
395
+
396
+ exit:
397
+ ret float %max.next
398
+ }
399
+
400
+ define float @fmax_oge_with_select_1 (ptr %src , i64 %n ) {
401
+ ; CHECK-LABEL: define float @fmax_oge_with_select_1(
402
+ ; CHECK-SAME: ptr [[SRC:%.*]], i64 [[N:%.*]]) {
403
+ ; CHECK-NEXT: [[ENTRY:.*]]:
404
+ ; CHECK-NEXT: br label %[[LOOP:.*]]
405
+ ; CHECK: [[LOOP]]:
406
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
407
+ ; CHECK-NEXT: [[MAX:%.*]] = phi float [ -1.000000e+07, %[[ENTRY]] ], [ [[MAX_NEXT:%.*]], %[[LOOP]] ]
408
+ ; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr inbounds nuw float, ptr [[SRC]], i64 [[IV]]
409
+ ; CHECK-NEXT: [[L:%.*]] = load float, ptr [[GEP_SRC]], align 4
410
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oge float [[L]], [[MAX]]
411
+ ; CHECK-NEXT: [[MAX_NEXT]] = select i1 [[CMP]], float [[L]], float [[MAX]]
412
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
413
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
414
+ ; CHECK-NEXT: br i1 [[EC]], label %[[EXIT:.*]], label %[[LOOP]]
415
+ ; CHECK: [[EXIT]]:
416
+ ; CHECK-NEXT: [[MAX_NEXT_LCSSA:%.*]] = phi float [ [[MAX_NEXT]], %[[LOOP]] ]
417
+ ; CHECK-NEXT: ret float [[MAX_NEXT_LCSSA]]
418
+ ;
419
+ entry:
420
+ br label %loop
421
+
422
+ loop:
423
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
424
+ %max = phi float [ -1 .000000e+07 , %entry ], [ %max.next , %loop ]
425
+ %gep.src = getelementptr inbounds nuw float , ptr %src , i64 %iv
426
+ %l = load float , ptr %gep.src , align 4
427
+ %cmp = fcmp oge float %l , %max
428
+ %max.next = select i1 %cmp , float %l , float %max
429
+ %iv.next = add nuw nsw i64 %iv , 1
430
+ %ec = icmp eq i64 %iv.next , %n
431
+ br i1 %ec , label %exit , label %loop
432
+
433
+ exit:
434
+ ret float %max.next
435
+ }
0 commit comments