Skip to content
Snippets Groups Projects
Commit 01853026 authored by Michael Ilseman's avatar Michael Ilseman
Browse files

Fast-math: IRBuilder test for creating instructions with fast-math flags

llvm-svn: 168814
parent be6871db
No related branches found
No related tags found
No related merge requests found
......@@ -31,6 +31,8 @@ protected:
/*isVarArg=*/false);
F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
BB = BasicBlock::Create(getGlobalContext(), "", F);
GV = new GlobalVariable(Type::getFloatTy(getGlobalContext()), true,
GlobalValue::ExternalLinkage);
}
virtual void TearDown() {
......@@ -41,6 +43,7 @@ protected:
OwningPtr<Module> M;
Function *F;
BasicBlock *BB;
GlobalVariable *GV;
};
TEST_F(IRBuilderTest, Lifetime) {
......@@ -108,4 +111,59 @@ TEST_F(IRBuilderTest, GetIntTy) {
EXPECT_EQ(IntPtrTy, IntegerType::get(getGlobalContext(), IntPtrBitSize));
}
TEST_F(IRBuilderTest, FastMathFlags) {
IRBuilder<> Builder(BB);
Value *F;
Instruction *FDiv, *FAdd;
F = Builder.CreateLoad(GV);
F = Builder.CreateFAdd(F, F);
EXPECT_FALSE(Builder.GetFastMathFlags().any());
ASSERT_TRUE(isa<Instruction>(F));
FAdd = cast<Instruction>(F);
EXPECT_FALSE(FAdd->hasNoNaNs());
FastMathFlags FMF;
Builder.SetFastMathFlags(FMF);
F = Builder.CreateFAdd(F, F);
EXPECT_FALSE(Builder.GetFastMathFlags().any());
FMF.UnsafeAlgebra = true;
Builder.SetFastMathFlags(FMF);
F = Builder.CreateFAdd(F, F);
EXPECT_TRUE(Builder.GetFastMathFlags().any());
ASSERT_TRUE(isa<Instruction>(F));
FAdd = cast<Instruction>(F);
EXPECT_TRUE(FAdd->hasNoNaNs());
F = Builder.CreateFDiv(F, F);
EXPECT_TRUE(Builder.GetFastMathFlags().any());
EXPECT_TRUE(Builder.GetFastMathFlags().UnsafeAlgebra);
ASSERT_TRUE(isa<Instruction>(F));
FDiv = cast<Instruction>(F);
EXPECT_TRUE(FDiv->hasAllowReciprocal());
Builder.ClearFastMathFlags();
F = Builder.CreateFDiv(F, F);
ASSERT_TRUE(isa<Instruction>(F));
FDiv = cast<Instruction>(F);
EXPECT_FALSE(FDiv->hasAllowReciprocal());
FMF.clear();
FMF.AllowReciprocal = true;
Builder.SetFastMathFlags(FMF);
F = Builder.CreateFDiv(F, F);
EXPECT_TRUE(Builder.GetFastMathFlags().any());
EXPECT_TRUE(Builder.GetFastMathFlags().AllowReciprocal);
ASSERT_TRUE(isa<Instruction>(F));
FDiv = cast<Instruction>(F);
EXPECT_TRUE(FDiv->hasAllowReciprocal());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment