aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/IR/IRBuilderTest.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-01-05 03:22:33 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-01-05 03:22:33 +0000
commit0db10c4feff8e1933f53811bff38737b18cf1af1 (patch)
treed4ce04d6695e0f72567b0d13f47289e5e3997359 /llvm/unittests/IR/IRBuilderTest.cpp
parent4002a941faa3c86de3be45245a2a02d601398df1 (diff)
downloadllvm-0db10c4feff8e1933f53811bff38737b18cf1af1.zip
llvm-0db10c4feff8e1933f53811bff38737b18cf1af1.tar.gz
llvm-0db10c4feff8e1933f53811bff38737b18cf1af1.tar.bz2
Fix a bug in IRBuilder that's been there for who knows how long. It
failed to correctly propagate the NUW and NSW flags to the constant folder for two instructions. I've added a unittest to cover flag propagation for the rest of the instructions and constant expressions. llvm-svn: 198538
Diffstat (limited to 'llvm/unittests/IR/IRBuilderTest.cpp')
-rw-r--r--llvm/unittests/IR/IRBuilderTest.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp
index fcb5677..a0a72e8 100644
--- a/llvm/unittests/IR/IRBuilderTest.cpp
+++ b/llvm/unittests/IR/IRBuilderTest.cpp
@@ -16,6 +16,7 @@
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
+#include "llvm/Support/NoFolder.h"
#include "gtest/gtest.h"
using namespace llvm;
@@ -190,6 +191,56 @@ TEST_F(IRBuilderTest, FastMathFlags) {
}
+TEST_F(IRBuilderTest, WrapFlags) {
+ IRBuilder<true, NoFolder> Builder(BB);
+
+ // Test instructions.
+ GlobalVariable *G = new GlobalVariable(*M, Builder.getInt32Ty(), true,
+ GlobalValue::ExternalLinkage, 0);
+ Value *V = Builder.CreateLoad(G);
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNSWAdd(V, V))->hasNoSignedWrap());
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNSWMul(V, V))->hasNoSignedWrap());
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNSWSub(V, V))->hasNoSignedWrap());
+ EXPECT_TRUE(cast<BinaryOperator>(
+ Builder.CreateShl(V, V, "", /* NUW */ false, /* NSW */ true))
+ ->hasNoSignedWrap());
+
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNUWAdd(V, V))->hasNoUnsignedWrap());
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNUWMul(V, V))->hasNoUnsignedWrap());
+ EXPECT_TRUE(
+ cast<BinaryOperator>(Builder.CreateNUWSub(V, V))->hasNoUnsignedWrap());
+ EXPECT_TRUE(cast<BinaryOperator>(
+ Builder.CreateShl(V, V, "", /* NUW */ true, /* NSW */ false))
+ ->hasNoUnsignedWrap());
+
+ // Test operators created with constants.
+ Constant *C = Builder.getInt32(42);
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWAdd(C, C))
+ ->hasNoSignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWSub(C, C))
+ ->hasNoSignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNSWMul(C, C))
+ ->hasNoSignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(
+ Builder.CreateShl(C, C, "", /* NUW */ false, /* NSW */ true))
+ ->hasNoSignedWrap());
+
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWAdd(C, C))
+ ->hasNoUnsignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWSub(C, C))
+ ->hasNoUnsignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(Builder.CreateNUWMul(C, C))
+ ->hasNoUnsignedWrap());
+ EXPECT_TRUE(cast<OverflowingBinaryOperator>(
+ Builder.CreateShl(C, C, "", /* NUW */ true, /* NSW */ false))
+ ->hasNoUnsignedWrap());
+}
+
TEST_F(IRBuilderTest, RAIIHelpersTest) {
IRBuilder<> Builder(BB);
EXPECT_FALSE(Builder.getFastMathFlags().allowReciprocal());