diff --git a/unittests/Makefile b/unittests/Makefile index 6f4dae1055c..9f377cd744c 100644 --- a/unittests/Makefile +++ b/unittests/Makefile @@ -9,7 +9,7 @@ LEVEL = .. -PARALLEL_DIRS = ADT ExecutionEngine Support VMCore +PARALLEL_DIRS = ADT ExecutionEngine Support Transforms VMCore include $(LEVEL)/Makefile.common diff --git a/unittests/Transforms/Makefile b/unittests/Transforms/Makefile new file mode 100644 index 00000000000..599b18a057d --- /dev/null +++ b/unittests/Transforms/Makefile @@ -0,0 +1,17 @@ +##===- unittests/Transforms/Makefile -----------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../.. + +PARALLEL_DIRS = Utils + +include $(LEVEL)/Makefile.common + +clean:: + $(Verb) $(RM) -f *Tests diff --git a/unittests/Transforms/Utils/Cloning.cpp b/unittests/Transforms/Utils/Cloning.cpp new file mode 100644 index 00000000000..7c93f6f5834 --- /dev/null +++ b/unittests/Transforms/Utils/Cloning.cpp @@ -0,0 +1,87 @@ +//===- Cloning.cpp - Unit tests for the Cloner ----------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" +#include "llvm/Argument.h" +#include "llvm/Instructions.h" + +using namespace llvm; + +TEST(CloneInstruction, OverflowBits) { + LLVMContext context; + Value *V = new Argument(Type::getInt32Ty(context)); + + BinaryOperator *Add = BinaryOperator::Create(Instruction::Add, V, V); + BinaryOperator *Sub = BinaryOperator::Create(Instruction::Sub, V, V); + BinaryOperator *Mul = BinaryOperator::Create(Instruction::Mul, V, V); + + EXPECT_FALSE(Add->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Add->clone()->hasNoSignedWrap()); + EXPECT_FALSE(Sub->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Sub->clone()->hasNoSignedWrap()); + EXPECT_FALSE(Mul->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Mul->clone()->hasNoSignedWrap()); + + Add->setHasNoUnsignedWrap(); + Sub->setHasNoUnsignedWrap(); + Mul->setHasNoUnsignedWrap(); + + EXPECT_TRUE(Add->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Add->clone()->hasNoSignedWrap()); + EXPECT_TRUE(Sub->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Sub->clone()->hasNoSignedWrap()); + EXPECT_TRUE(Mul->clone()->hasNoUnsignedWrap()); + EXPECT_FALSE(Mul->clone()->hasNoSignedWrap()); + + Add->setHasNoSignedWrap(); + Sub->setHasNoSignedWrap(); + Mul->setHasNoSignedWrap(); + + EXPECT_TRUE(Add->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Add->clone()->hasNoSignedWrap()); + EXPECT_TRUE(Sub->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Sub->clone()->hasNoSignedWrap()); + EXPECT_TRUE(Mul->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Mul->clone()->hasNoSignedWrap()); + + Add->setHasNoUnsignedWrap(false); + Sub->setHasNoUnsignedWrap(false); + Mul->setHasNoUnsignedWrap(false); + + EXPECT_FALSE(Add->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Add->clone()->hasNoSignedWrap()); + EXPECT_FALSE(Sub->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Sub->clone()->hasNoSignedWrap()); + EXPECT_FALSE(Mul->clone()->hasNoUnsignedWrap()); + EXPECT_TRUE(Mul->clone()->hasNoSignedWrap()); +} + +TEST(CloneInstruction, Inbounds) { + LLVMContext context; + Value *V = new Argument(Type::getInt32Ty(context)->getPointerTo()); + Constant *Z = Constant::getNullValue(Type::getInt32Ty(context)); + std::vector ops; + ops.push_back(Z); + GetElementPtrInst *GEP = GetElementPtrInst::Create(V, ops.begin(), ops.end()); + EXPECT_FALSE(GEP->clone()->isInBounds()); + + GEP->setIsInBounds(); + EXPECT_TRUE(GEP->clone()->isInBounds()); +} + +TEST(CloneInstruction, Exact) { + LLVMContext context; + Value *V = new Argument(Type::getInt32Ty(context)); + + BinaryOperator *SDiv = BinaryOperator::Create(Instruction::SDiv, V, V); + EXPECT_FALSE(SDiv->clone()->isExact()); + + SDiv->setIsExact(true); + EXPECT_TRUE(SDiv->clone()->isExact()); +} diff --git a/unittests/Transforms/Utils/Makefile b/unittests/Transforms/Utils/Makefile new file mode 100644 index 00000000000..fdf4be0e0ef --- /dev/null +++ b/unittests/Transforms/Utils/Makefile @@ -0,0 +1,15 @@ +##===- unittests/Transforms/Utils/Makefile -----------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../.. +TESTNAME = Utils +LINK_COMPONENTS := core support transformutils + +include $(LEVEL)/Makefile.config +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest