@@ -77,3 +77,137 @@ return: ; preds = %entry,%if.then
77
77
%retval = load double , ptr %x.addr
78
78
ret double %retval
79
79
}
80
+
81
+ define double @phi_with_nnan (double %x ) "no-nans-fp-math" ="true" {
82
+ ; CHECK-LABEL: define double @phi_with_nnan(
83
+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR2:[0-9]+]] {
84
+ ; CHECK-NEXT: entry:
85
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
86
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
87
+ ; CHECK: if.then:
88
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
89
+ ; CHECK-NEXT: br label [[RETURN]]
90
+ ; CHECK: return:
91
+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi nnan double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
92
+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
93
+ ;
94
+ entry:
95
+ %x.addr = alloca double
96
+ %cmp = fcmp olt double %x , 0 .0
97
+ br i1 %cmp , label %if.then , label %return
98
+
99
+ if.then: ; preds = %entry
100
+ %fneg = fneg double %x
101
+ store double %fneg , ptr %x.addr
102
+ br label %return
103
+
104
+ return: ; preds = %entry,%if.then
105
+ %retval = load double , ptr %x.addr
106
+ ret double %retval
107
+ }
108
+
109
+ define <2 x double > @vector_phi_with_nnan (<2 x double > %x , i1 %cmp , <2 x double > %a , <2 x double > %b ) "no-nans-fp-math" ="true" {
110
+ ; CHECK-LABEL: define <2 x double> @vector_phi_with_nnan(
111
+ ; CHECK-SAME: <2 x double> [[X:%.*]], i1 [[CMP:%.*]], <2 x double> [[A:%.*]], <2 x double> [[B:%.*]]) #[[ATTR2]] {
112
+ ; CHECK-NEXT: entry:
113
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
114
+ ; CHECK: if.then:
115
+ ; CHECK-NEXT: br label [[RETURN]]
116
+ ; CHECK: return:
117
+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi nnan <2 x double> [ [[B]], [[IF_THEN]] ], [ [[A]], [[ENTRY:%.*]] ]
118
+ ; CHECK-NEXT: ret <2 x double> [[X_ADDR_0]]
119
+ ;
120
+ entry:
121
+ %x.addr = alloca <2 x double >
122
+ store <2 x double > %a , ptr %x.addr
123
+ br i1 %cmp , label %if.then , label %return
124
+
125
+ if.then: ; preds = %entry
126
+ store <2 x double > %b , ptr %x.addr
127
+ br label %return
128
+
129
+ return: ; preds = %entry,%if.then
130
+ %retval = load <2 x double >, ptr %x.addr
131
+ ret <2 x double > %retval
132
+ }
133
+
134
+ define double @phi_without_nnan (double %x ) "no-nans-fp-math" ="false" {
135
+ ; CHECK-LABEL: define double @phi_without_nnan(
136
+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR3:[0-9]+]] {
137
+ ; CHECK-NEXT: entry:
138
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
139
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
140
+ ; CHECK: if.then:
141
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
142
+ ; CHECK-NEXT: br label [[RETURN]]
143
+ ; CHECK: return:
144
+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
145
+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
146
+ ;
147
+ entry:
148
+ %x.addr = alloca double
149
+ %cmp = fcmp olt double %x , 0 .0
150
+ br i1 %cmp , label %if.then , label %return
151
+
152
+ if.then: ; preds = %entry
153
+ %fneg = fneg double %x
154
+ store double %fneg , ptr %x.addr
155
+ br label %return
156
+
157
+ return: ; preds = %entry,%if.then
158
+ %retval = load double , ptr %x.addr
159
+ ret double %retval
160
+ }
161
+
162
+ define <2 x double > @vector_phi_with_ninf (<2 x double > %x , i1 %cmp , <2 x double > %a , <2 x double > %b ) "no-infs-fp-math" ="true" {
163
+ ; CHECK-LABEL: define <2 x double> @vector_phi_with_ninf(
164
+ ; CHECK-SAME: <2 x double> [[X:%.*]], i1 [[CMP:%.*]], <2 x double> [[A:%.*]], <2 x double> [[B:%.*]]) #[[ATTR4:[0-9]+]] {
165
+ ; CHECK-NEXT: entry:
166
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
167
+ ; CHECK: if.then:
168
+ ; CHECK-NEXT: br label [[RETURN]]
169
+ ; CHECK: return:
170
+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi ninf <2 x double> [ [[B]], [[IF_THEN]] ], [ [[A]], [[ENTRY:%.*]] ]
171
+ ; CHECK-NEXT: ret <2 x double> [[X_ADDR_0]]
172
+ ;
173
+ entry:
174
+ %x.addr = alloca <2 x double >
175
+ store <2 x double > %a , ptr %x.addr
176
+ br i1 %cmp , label %if.then , label %return
177
+
178
+ if.then: ; preds = %entry
179
+ store <2 x double > %b , ptr %x.addr
180
+ br label %return
181
+
182
+ return: ; preds = %entry,%if.then
183
+ %retval = load <2 x double >, ptr %x.addr
184
+ ret <2 x double > %retval
185
+ }
186
+
187
+ define double @phi_without_ninf (double %x ) "no-infs-fp-math" ="false" {
188
+ ; CHECK-LABEL: define double @phi_without_ninf(
189
+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR5:[0-9]+]] {
190
+ ; CHECK-NEXT: entry:
191
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
192
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
193
+ ; CHECK: if.then:
194
+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
195
+ ; CHECK-NEXT: br label [[RETURN]]
196
+ ; CHECK: return:
197
+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
198
+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
199
+ ;
200
+ entry:
201
+ %x.addr = alloca double
202
+ %cmp = fcmp olt double %x , 0 .0
203
+ br i1 %cmp , label %if.then , label %return
204
+
205
+ if.then: ; preds = %entry
206
+ %fneg = fneg double %x
207
+ store double %fneg , ptr %x.addr
208
+ br label %return
209
+
210
+ return: ; preds = %entry,%if.then
211
+ %retval = load double , ptr %x.addr
212
+ ret double %retval
213
+ }
0 commit comments