|
2 | 2 | ; RUN: opt -S -instcombine < %s | FileCheck %s
|
3 | 3 |
|
4 | 4 | define float @select_max_ugt(float %a, float %b) {
|
5 |
| -; CHECK-LABEL: @select_max_ugt( |
6 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp ole float [[A:%.*]], [[B:%.*]] |
| 5 | +; CHECK-LABEL: define {{[^@]+}}@select_max_ugt( |
| 6 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp arcp ole float [[A:%.*]], [[B:%.*]] |
7 | 7 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
8 | 8 | ; CHECK-NEXT: ret float [[SEL]]
|
9 | 9 | ;
|
10 |
| - %cmp = fcmp ugt float %a, %b |
11 |
| - %sel = select i1 %cmp, float %a, float %b |
| 10 | + %cmp = fcmp arcp ugt float %a, %b |
| 11 | + %sel = select arcp i1 %cmp, float %a, float %b |
12 | 12 | ret float %sel
|
13 | 13 | }
|
14 | 14 |
|
15 | 15 | define float @select_max_uge(float %a, float %b) {
|
16 |
| -; CHECK-LABEL: @select_max_uge( |
17 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp olt float [[A:%.*]], [[B:%.*]] |
| 16 | +; CHECK-LABEL: define {{[^@]+}}@select_max_uge( |
| 17 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp nnan olt float [[A:%.*]], [[B:%.*]] |
18 | 18 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
19 | 19 | ; CHECK-NEXT: ret float [[SEL]]
|
20 | 20 | ;
|
21 |
| - %cmp = fcmp uge float %a, %b |
22 |
| - %sel = select i1 %cmp, float %a, float %b |
| 21 | + %cmp = fcmp nnan uge float %a, %b |
| 22 | + %sel = select ninf i1 %cmp, float %a, float %b |
23 | 23 | ret float %sel
|
24 | 24 | }
|
25 | 25 |
|
26 | 26 | define float @select_min_ugt(float %a, float %b) {
|
27 |
| -; CHECK-LABEL: @select_min_ugt( |
28 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp ole float [[A:%.*]], [[B:%.*]] |
| 27 | +; CHECK-LABEL: define {{[^@]+}}@select_min_ugt( |
| 28 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp fast ole float [[A:%.*]], [[B:%.*]] |
29 | 29 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[A]], float [[B]]
|
30 | 30 | ; CHECK-NEXT: ret float [[SEL]]
|
31 | 31 | ;
|
32 |
| - %cmp = fcmp ugt float %a, %b |
33 |
| - %sel = select i1 %cmp, float %b, float %a |
| 32 | + %cmp = fcmp fast ugt float %a, %b |
| 33 | + %sel = select reassoc i1 %cmp, float %b, float %a |
34 | 34 | ret float %sel
|
35 | 35 | }
|
36 | 36 |
|
37 | 37 | define float @select_min_uge(float %a, float %b) {
|
38 |
| -; CHECK-LABEL: @select_min_uge( |
39 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp olt float [[A:%.*]], [[B:%.*]] |
| 38 | +; CHECK-LABEL: define {{[^@]+}}@select_min_uge( |
| 39 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp nsz olt float [[A:%.*]], [[B:%.*]] |
40 | 40 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[A]], float [[B]]
|
41 | 41 | ; CHECK-NEXT: ret float [[SEL]]
|
42 | 42 | ;
|
43 |
| - %cmp = fcmp uge float %a, %b |
44 |
| - %sel = select i1 %cmp, float %b, float %a |
| 43 | + %cmp = fcmp nsz uge float %a, %b |
| 44 | + %sel = select fast i1 %cmp, float %b, float %a |
45 | 45 | ret float %sel
|
46 | 46 | }
|
47 | 47 |
|
48 | 48 | define float @select_max_ult(float %a, float %b) {
|
49 |
| -; CHECK-LABEL: @select_max_ult( |
50 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp oge float [[A:%.*]], [[B:%.*]] |
| 49 | +; CHECK-LABEL: define {{[^@]+}}@select_max_ult( |
| 50 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp arcp oge float [[A:%.*]], [[B:%.*]] |
51 | 51 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[A]], float [[B]]
|
52 | 52 | ; CHECK-NEXT: ret float [[SEL]]
|
53 | 53 | ;
|
54 |
| - %cmp = fcmp ult float %a, %b |
55 |
| - %sel = select i1 %cmp, float %b, float %a |
| 54 | + %cmp = fcmp arcp ult float %a, %b |
| 55 | + %sel = select ninf nnan i1 %cmp, float %b, float %a |
56 | 56 | ret float %sel
|
57 | 57 | }
|
58 | 58 |
|
59 | 59 | define float @select_max_ule(float %a, float %b) {
|
60 |
| -; CHECK-LABEL: @select_max_ule( |
61 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp ogt float [[A:%.*]], [[B:%.*]] |
| 60 | +; CHECK-LABEL: define {{[^@]+}}@select_max_ule( |
| 61 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp fast ogt float [[A:%.*]], [[B:%.*]] |
62 | 62 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[A]], float [[B]]
|
63 | 63 | ; CHECK-NEXT: ret float [[SEL]]
|
64 | 64 | ;
|
65 |
| - %cmp = fcmp ule float %a, %b |
66 |
| - %sel = select i1 %cmp, float %b, float %a |
| 65 | + %cmp = fcmp fast ule float %a, %b |
| 66 | + %sel = select nsz i1 %cmp, float %b, float %a |
67 | 67 | ret float %sel
|
68 | 68 | }
|
69 | 69 |
|
70 | 70 | define float @select_min_ult(float %a, float %b) {
|
71 |
| -; CHECK-LABEL: @select_min_ult( |
72 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp oge float [[A:%.*]], [[B:%.*]] |
| 71 | +; CHECK-LABEL: define {{[^@]+}}@select_min_ult( |
| 72 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp nsz oge float [[A:%.*]], [[B:%.*]] |
73 | 73 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
74 | 74 | ; CHECK-NEXT: ret float [[SEL]]
|
75 | 75 | ;
|
76 |
| - %cmp = fcmp ult float %a, %b |
77 |
| - %sel = select i1 %cmp, float %a, float %b |
| 76 | + %cmp = fcmp nsz ult float %a, %b |
| 77 | + %sel = select fast i1 %cmp, float %a, float %b |
78 | 78 | ret float %sel
|
79 | 79 | }
|
80 | 80 |
|
81 | 81 | define float @select_min_ule(float %a, float %b) {
|
82 |
| -; CHECK-LABEL: @select_min_ule( |
83 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp ogt float [[A:%.*]], [[B:%.*]] |
| 82 | +; CHECK-LABEL: define {{[^@]+}}@select_min_ule( |
| 83 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp arcp ogt float [[A:%.*]], [[B:%.*]] |
84 | 84 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
85 | 85 | ; CHECK-NEXT: ret float [[SEL]]
|
86 | 86 | ;
|
87 |
| - %cmp = fcmp ule float %a, %b |
88 |
| - %sel = select i1 %cmp, float %a, float %b |
| 87 | + %cmp = fcmp arcp ule float %a, %b |
| 88 | + %sel = select ninf i1 %cmp, float %a, float %b |
89 | 89 | ret float %sel
|
90 | 90 | }
|
91 | 91 |
|
92 | 92 | define float @select_fcmp_une(float %a, float %b) {
|
93 |
| -; CHECK-LABEL: @select_fcmp_une( |
94 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp oeq float [[A:%.*]], [[B:%.*]] |
| 93 | +; CHECK-LABEL: define {{[^@]+}}@select_fcmp_une( |
| 94 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp reassoc oeq float [[A:%.*]], [[B:%.*]] |
95 | 95 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
96 | 96 | ; CHECK-NEXT: ret float [[SEL]]
|
97 | 97 | ;
|
98 |
| - %cmp = fcmp une float %a, %b |
99 |
| - %sel = select i1 %cmp, float %a, float %b |
| 98 | + %cmp = fcmp reassoc une float %a, %b |
| 99 | + %sel = select nnan i1 %cmp, float %a, float %b |
100 | 100 | ret float %sel
|
101 | 101 | }
|
102 | 102 |
|
103 | 103 | define float @select_fcmp_ueq(float %a, float %b) {
|
104 |
| -; CHECK-LABEL: @select_fcmp_ueq( |
105 |
| -; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp one float [[A:%.*]], [[B:%.*]] |
| 104 | +; CHECK-LABEL: define {{[^@]+}}@select_fcmp_ueq( |
| 105 | +; CHECK-NEXT: [[CMP_INV:%.*]] = fcmp reassoc one float [[A:%.*]], [[B:%.*]] |
106 | 106 | ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP_INV]], float [[B]], float [[A]]
|
107 | 107 | ; CHECK-NEXT: ret float [[SEL]]
|
108 | 108 | ;
|
109 |
| - %cmp = fcmp ueq float %a, %b |
110 |
| - %sel = select i1 %cmp, float %a, float %b |
| 109 | + %cmp = fcmp reassoc ueq float %a, %b |
| 110 | + %sel = select arcp nnan i1 %cmp, float %a, float %b |
111 | 111 | ret float %sel
|
112 | 112 | }
|
113 | 113 |
|
114 | 114 | declare void @foo(i1)
|
115 | 115 |
|
116 | 116 | define float @select_max_ugt_2_use_cmp(float %a, float %b) {
|
117 |
| -; CHECK-LABEL: @select_max_ugt_2_use_cmp( |
118 |
| -; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[A:%.*]], [[B:%.*]] |
| 117 | +; CHECK-LABEL: define {{[^@]+}}@select_max_ugt_2_use_cmp( |
| 118 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp reassoc ugt float [[A:%.*]], [[B:%.*]] |
119 | 119 | ; CHECK-NEXT: call void @foo(i1 [[CMP]])
|
120 |
| -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], float [[A]], float [[B]] |
| 120 | +; CHECK-NEXT: [[SEL:%.*]] = select fast i1 [[CMP]], float [[A]], float [[B]] |
121 | 121 | ; CHECK-NEXT: ret float [[SEL]]
|
122 | 122 | ;
|
123 |
| - %cmp = fcmp ugt float %a, %b |
| 123 | + %cmp = fcmp reassoc ugt float %a, %b |
124 | 124 | call void @foo(i1 %cmp)
|
125 |
| - %sel = select i1 %cmp, float %a, float %b |
| 125 | + %sel = select fast i1 %cmp, float %a, float %b |
126 | 126 | ret float %sel
|
127 | 127 | }
|
128 | 128 |
|
129 | 129 | define float @select_min_uge_2_use_cmp(float %a, float %b) {
|
130 |
| -; CHECK-LABEL: @select_min_uge_2_use_cmp( |
131 |
| -; CHECK-NEXT: [[CMP:%.*]] = fcmp uge float [[A:%.*]], [[B:%.*]] |
| 130 | +; CHECK-LABEL: define {{[^@]+}}@select_min_uge_2_use_cmp( |
| 131 | +; CHECK-NEXT: [[CMP:%.*]] = fcmp ninf uge float [[A:%.*]], [[B:%.*]] |
132 | 132 | ; CHECK-NEXT: call void @foo(i1 [[CMP]])
|
133 |
| -; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], float [[B]], float [[A]] |
| 133 | +; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], float [[B]], float [[A]] |
134 | 134 | ; CHECK-NEXT: ret float [[SEL]]
|
135 | 135 | ;
|
136 |
| - %cmp = fcmp uge float %a, %b |
| 136 | + %cmp = fcmp ninf uge float %a, %b |
137 | 137 | call void @foo(i1 %cmp)
|
138 |
| - %sel = select i1 %cmp, float %b, float %a |
| 138 | + %sel = select nsz i1 %cmp, float %b, float %a |
139 | 139 | ret float %sel
|
140 | 140 | }
|
0 commit comments