diff options
author | Denis Bakhvalov <denis.bakhvalov@intel.com> | 2019-07-08 18:03:43 +0000 |
---|---|---|
committer | Denis Bakhvalov <denis.bakhvalov@intel.com> | 2019-07-08 18:03:43 +0000 |
commit | 74be349bcff4a4e420d7a9d487b9c6c04bff0582 (patch) | |
tree | fa79e044be1e71696a2b0a9fef2cadff760f048e /llvm/unittests/Analysis/ScalarEvolutionTest.cpp | |
parent | 77ccc04700ca8831b1358442431154b3ff054cd7 (diff) | |
download | bcm5719-llvm-74be349bcff4a4e420d7a9d487b9c6c04bff0582.tar.gz bcm5719-llvm-74be349bcff4a4e420d7a9d487b9c6c04bff0582.zip |
[SCEV] Fix for PR42397. SCEVExpander wrongly adds nsw to shl instruction.
Change-Id: I76c9f628c092ae3e6e78ebdaf55cec726e25d692
llvm-svn: 365363
Diffstat (limited to 'llvm/unittests/Analysis/ScalarEvolutionTest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/ScalarEvolutionTest.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp index 1d74fb12844..fb8f6689ca7 100644 --- a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp +++ b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp @@ -1637,5 +1637,46 @@ TEST_F(ScalarEvolutionsTest, SCEVExpandInsertCanonicalIV) { TestMatchingCanonicalIV(GetAR2, ARBitWidth); } +TEST_F(ScalarEvolutionsTest, SCEVExpanderShlNSW) { + + auto checkOneCase = [this](std::string &&str) { + LLVMContext C; + SMDiagnostic Err; + std::unique_ptr<Module> M = parseAssemblyString(str, Err, C); + + assert(M && "Could not parse module?"); + assert(!verifyModule(*M) && "Must have been well formed!"); + + Function *F = M->getFunction("f"); + ASSERT_NE(F, nullptr) << "Could not find function 'f'"; + + BasicBlock &Entry = F->getEntryBlock(); + LoadInst *Load = cast<LoadInst>(&Entry.front()); + BinaryOperator *And = cast<BinaryOperator>(*Load->user_begin()); + + ScalarEvolution SE = buildSE(*F); + const SCEV *AndSCEV = SE.getSCEV(And); + EXPECT_TRUE(isa<SCEVMulExpr>(AndSCEV)); + EXPECT_TRUE(cast<SCEVMulExpr>(AndSCEV)->hasNoSignedWrap()); + + SCEVExpander Exp(SE, M->getDataLayout(), "expander"); + auto *I = cast<Instruction>(Exp.expandCodeFor(AndSCEV, nullptr, And)); + EXPECT_EQ(I->getOpcode(), Instruction::Shl); + EXPECT_FALSE(I->hasNoSignedWrap()); + }; + + checkOneCase("define void @f(i16* %arrayidx) { " + " %1 = load i16, i16* %arrayidx " + " %2 = and i16 %1, -32768 " + " ret void " + "} "); + + checkOneCase("define void @f(i8* %arrayidx) { " + " %1 = load i8, i8* %arrayidx " + " %2 = and i8 %1, -128 " + " ret void " + "} "); +} + } // end anonymous namespace } // end namespace llvm |