@@ -130,6 +130,161 @@ define void @foo(i32 %v0) {
130
130
EXPECT_NE (FortyThree, FortyTwo);
131
131
}
132
132
133
+ TEST_F (SandboxIRTest, ConstantFP) {
134
+ parseIR (C, R"IR(
135
+ define void @foo(float %v0, double %v1) {
136
+ %fadd0 = fadd float %v0, 42.0
137
+ %fadd1 = fadd double %v1, 43.0
138
+ ret void
139
+ }
140
+ )IR" );
141
+ Function &LLVMF = *M->getFunction (" foo" );
142
+ sandboxir::Context Ctx (C);
143
+
144
+ auto &F = *Ctx.createFunction (&LLVMF);
145
+ auto &BB = *F.begin ();
146
+ auto It = BB.begin ();
147
+ auto *FAdd0 = cast<sandboxir::BinaryOperator>(&*It++);
148
+ auto *FAdd1 = cast<sandboxir::BinaryOperator>(&*It++);
149
+ auto *FortyTwo = cast<sandboxir::ConstantFP>(FAdd0->getOperand (1 ));
150
+ [[maybe_unused]] auto *FortyThree =
151
+ cast<sandboxir::ConstantFP>(FAdd1->getOperand (1 ));
152
+
153
+ auto *FloatTy = sandboxir::Type::getFloatTy (Ctx);
154
+ auto *DoubleTy = sandboxir::Type::getDoubleTy (Ctx);
155
+ auto *LLVMFloatTy = Type::getFloatTy (C);
156
+ auto *LLVMDoubleTy = Type::getDoubleTy (C);
157
+ // Check that creating an identical constant gives us the same object.
158
+ auto *NewFortyTwo = sandboxir::ConstantFP::get (FloatTy, 42.0 );
159
+ EXPECT_EQ (NewFortyTwo, FortyTwo);
160
+ // Check get(Type, double).
161
+ auto *FortyFour =
162
+ cast<sandboxir::ConstantFP>(sandboxir::ConstantFP::get (FloatTy, 44.0 ));
163
+ auto *LLVMFortyFour =
164
+ cast<llvm::ConstantFP>(llvm::ConstantFP::get (LLVMFloatTy, 44.0 ));
165
+ EXPECT_NE (FortyFour, FortyTwo);
166
+ EXPECT_EQ (FortyFour, Ctx.getValue (LLVMFortyFour));
167
+ // Check get(Type, APFloat).
168
+ auto *FortyFive = cast<sandboxir::ConstantFP>(
169
+ sandboxir::ConstantFP::get (DoubleTy, APFloat (45.0 )));
170
+ auto *LLVMFortyFive = cast<llvm::ConstantFP>(
171
+ llvm::ConstantFP::get (LLVMDoubleTy, APFloat (45.0 )));
172
+ EXPECT_EQ (FortyFive, Ctx.getValue (LLVMFortyFive));
173
+ // Check get(Type, StringRef).
174
+ auto *FortySix = sandboxir::ConstantFP::get (FloatTy, " 46.0" );
175
+ EXPECT_EQ (FortySix, Ctx.getValue (llvm::ConstantFP::get (LLVMFloatTy, " 46.0" )));
176
+ // Check get(APFloat).
177
+ auto *FortySeven = sandboxir::ConstantFP::get (APFloat (47.0 ), Ctx);
178
+ EXPECT_EQ (FortySeven, Ctx.getValue (llvm::ConstantFP::get (C, APFloat (47.0 ))));
179
+ // Check getNaN().
180
+ {
181
+ auto *NaN = sandboxir::ConstantFP::getNaN (FloatTy);
182
+ EXPECT_EQ (NaN, Ctx.getValue (llvm::ConstantFP::getNaN (LLVMFloatTy)));
183
+ }
184
+ {
185
+ auto *NaN = sandboxir::ConstantFP::getNaN (FloatTy, /* Negative=*/ true );
186
+ EXPECT_EQ (NaN, Ctx.getValue (llvm::ConstantFP::getNaN (LLVMFloatTy,
187
+ /* Negative=*/ true )));
188
+ }
189
+ {
190
+ auto *NaN = sandboxir::ConstantFP::getNaN (FloatTy, /* Negative=*/ true ,
191
+ /* Payload=*/ 1 );
192
+ EXPECT_EQ (NaN, Ctx.getValue (llvm::ConstantFP::getNaN (
193
+ LLVMFloatTy, /* Negative=*/ true , /* Payload=*/ 1 )));
194
+ }
195
+ // Check getQNaN().
196
+ {
197
+ auto *QNaN = sandboxir::ConstantFP::getQNaN (FloatTy);
198
+ EXPECT_EQ (QNaN, Ctx.getValue (llvm::ConstantFP::getQNaN (LLVMFloatTy)));
199
+ }
200
+ {
201
+ auto *QNaN = sandboxir::ConstantFP::getQNaN (FloatTy, /* Negative=*/ true );
202
+ EXPECT_EQ (QNaN, Ctx.getValue (llvm::ConstantFP::getQNaN (LLVMFloatTy,
203
+ /* Negative=*/ true )));
204
+ }
205
+ {
206
+ APInt Payload (1 , 1 );
207
+ auto *QNaN =
208
+ sandboxir::ConstantFP::getQNaN (FloatTy, /* Negative=*/ true , &Payload);
209
+ EXPECT_EQ (QNaN, Ctx.getValue (llvm::ConstantFP::getQNaN (
210
+ LLVMFloatTy, /* Negative=*/ true , &Payload)));
211
+ }
212
+ // Check getSNaN().
213
+ {
214
+ auto *SNaN = sandboxir::ConstantFP::getSNaN (FloatTy);
215
+ EXPECT_EQ (SNaN, Ctx.getValue (llvm::ConstantFP::getSNaN (LLVMFloatTy)));
216
+ }
217
+ {
218
+ auto *SNaN = sandboxir::ConstantFP::getSNaN (FloatTy, /* Negative=*/ true );
219
+ EXPECT_EQ (SNaN, Ctx.getValue (llvm::ConstantFP::getSNaN (LLVMFloatTy,
220
+ /* Negative=*/ true )));
221
+ }
222
+ {
223
+ APInt Payload (1 , 1 );
224
+ auto *SNaN =
225
+ sandboxir::ConstantFP::getSNaN (FloatTy, /* Negative=*/ true , &Payload);
226
+ EXPECT_EQ (SNaN, Ctx.getValue (llvm::ConstantFP::getSNaN (
227
+ LLVMFloatTy, /* Negative=*/ true , &Payload)));
228
+ }
229
+
230
+ // Check getZero().
231
+ {
232
+ auto *Zero = sandboxir::ConstantFP::getZero (FloatTy);
233
+ EXPECT_EQ (Zero, Ctx.getValue (llvm::ConstantFP::getZero (LLVMFloatTy)));
234
+ }
235
+ {
236
+ auto *Zero = sandboxir::ConstantFP::getZero (FloatTy, /* Negative=*/ true );
237
+ EXPECT_EQ (Zero, Ctx.getValue (llvm::ConstantFP::getZero (LLVMFloatTy,
238
+ /* Negative=*/ true )));
239
+ }
240
+
241
+ // Check getNegativeZero().
242
+ auto *NegZero = cast<sandboxir::ConstantFP>(
243
+ sandboxir::ConstantFP::getNegativeZero (FloatTy));
244
+ EXPECT_EQ (NegZero,
245
+ Ctx.getValue (llvm::ConstantFP::getNegativeZero (LLVMFloatTy)));
246
+
247
+ // Check getInfinity().
248
+ {
249
+ auto *Inf = sandboxir::ConstantFP::getInfinity (FloatTy);
250
+ EXPECT_EQ (Inf, Ctx.getValue (llvm::ConstantFP::getInfinity (LLVMFloatTy)));
251
+ }
252
+ {
253
+ auto *Inf = sandboxir::ConstantFP::getInfinity (FloatTy, /* Negative=*/ true );
254
+ EXPECT_EQ (Inf, Ctx.getValue (llvm::ConstantFP::getInfinity (
255
+ LLVMFloatTy, /* Negative=*/ true )));
256
+ }
257
+
258
+ // Check isValueValidForType().
259
+ APFloat V (1.1 );
260
+ EXPECT_EQ (sandboxir::ConstantFP::isValueValidForType (FloatTy, V),
261
+ llvm::ConstantFP::isValueValidForType (LLVMFloatTy, V));
262
+ // Check getValueAPF().
263
+ EXPECT_EQ (FortyFour->getValueAPF (), LLVMFortyFour->getValueAPF ());
264
+ // Check getValue().
265
+ EXPECT_EQ (FortyFour->getValue (), LLVMFortyFour->getValue ());
266
+ // Check isZero().
267
+ EXPECT_EQ (FortyFour->isZero (), LLVMFortyFour->isZero ());
268
+ EXPECT_TRUE (sandboxir::ConstantFP::getZero (FloatTy));
269
+ EXPECT_TRUE (sandboxir::ConstantFP::getZero (FloatTy, /* Negative=*/ true ));
270
+ // Check isNegative().
271
+ EXPECT_TRUE (cast<sandboxir::ConstantFP>(
272
+ sandboxir::ConstantFP::getZero (FloatTy, /* Negative=*/ true ))
273
+ ->isNegative ());
274
+ // Check isInfinity().
275
+ EXPECT_TRUE (
276
+ cast<sandboxir::ConstantFP>(sandboxir::ConstantFP::getInfinity (FloatTy))
277
+ ->isInfinity ());
278
+ // Check isNaN().
279
+ EXPECT_TRUE (
280
+ cast<sandboxir::ConstantFP>(sandboxir::ConstantFP::getNaN (FloatTy))
281
+ ->isNaN ());
282
+ // Check isExactlyValue(APFloat).
283
+ EXPECT_TRUE (NegZero->isExactlyValue (NegZero->getValueAPF ()));
284
+ // Check isExactlyValue(double).
285
+ EXPECT_TRUE (NegZero->isExactlyValue (-0.0 ));
286
+ }
287
+
133
288
TEST_F (SandboxIRTest, Use) {
134
289
parseIR (C, R"IR(
135
290
define i32 @foo(i32 %v0, i32 %v1) {
0 commit comments