@@ -130,6 +130,161 @@ define void @foo(i32 %v0) {
130130 EXPECT_NE (FortyThree, FortyTwo);
131131}
132132
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+
133288TEST_F (SandboxIRTest, Use) {
134289 parseIR (C, R"IR(
135290define i32 @foo(i32 %v0, i32 %v1) {
0 commit comments