blob: 80af92d605592e1e6637a7f2ebdee471bdbebf6c [file] [log] [blame]
Dan Gohman7cac9572010-08-02 23:49:30 +00001//===- ScalarEvolutionsTest.cpp - ScalarEvolution unit tests --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Keno Fischer090f1952017-05-27 03:22:55 +000010#include "llvm/ADT/SmallVector.h"
Daniel Jasperaec2fa32016-12-19 08:22:17 +000011#include "llvm/Analysis/AssumptionCache.h"
Chandler Carruth2f1fd162015-08-17 02:08:17 +000012#include "llvm/Analysis/LoopInfo.h"
Keno Fischer090f1952017-05-27 03:22:55 +000013#include "llvm/Analysis/ScalarEvolutionExpander.h"
14#include "llvm/Analysis/ScalarEvolutionExpressions.h"
15#include "llvm/Analysis/TargetLibraryInfo.h"
Sanjoy Das507dd402016-10-18 17:45:16 +000016#include "llvm/AsmParser/Parser.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000017#include "llvm/IR/Constants.h"
Chandler Carruth2f1fd162015-08-17 02:08:17 +000018#include "llvm/IR/Dominators.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/GlobalVariable.h"
Keno Fischer090f1952017-05-27 03:22:55 +000020#include "llvm/IR/IRBuilder.h"
Sanjoy Das507dd402016-10-18 17:45:16 +000021#include "llvm/IR/InstIterator.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000022#include "llvm/IR/LLVMContext.h"
Chandler Carruth30d69c22015-02-13 10:01:29 +000023#include "llvm/IR/LegacyPassManager.h"
Keno Fischer090f1952017-05-27 03:22:55 +000024#include "llvm/IR/Module.h"
Sanjoy Das507dd402016-10-18 17:45:16 +000025#include "llvm/IR/Verifier.h"
26#include "llvm/Support/SourceMgr.h"
Sanjoy Dasc70a7a02017-10-13 17:13:44 +000027#include "gmock/gmock.h"
Dan Gohman7cac9572010-08-02 23:49:30 +000028#include "gtest/gtest.h"
29
30namespace llvm {
31namespace {
32
Sanjoy Dasc70a7a02017-10-13 17:13:44 +000033MATCHER_P3(IsAffineAddRec, S, X, L, "") {
34 if (auto *AR = dyn_cast<SCEVAddRecExpr>(arg))
35 return AR->isAffine() && AR->getLoop() == L && AR->getOperand(0) == S &&
36 AR->getOperand(1) == X;
37 return false;
38}
39
Nick Lewycky287682e2011-10-04 06:51:26 +000040// We use this fixture to ensure that we clean up ScalarEvolution before
41// deleting the PassManager.
42class ScalarEvolutionsTest : public testing::Test {
43protected:
Dan Gohman7cac9572010-08-02 23:49:30 +000044 LLVMContext Context;
Nick Lewycky287682e2011-10-04 06:51:26 +000045 Module M;
Chandler Carruth2f1fd162015-08-17 02:08:17 +000046 TargetLibraryInfoImpl TLII;
47 TargetLibraryInfo TLI;
48
Daniel Jasperaec2fa32016-12-19 08:22:17 +000049 std::unique_ptr<AssumptionCache> AC;
Chandler Carruth2f1fd162015-08-17 02:08:17 +000050 std::unique_ptr<DominatorTree> DT;
51 std::unique_ptr<LoopInfo> LI;
52
53 ScalarEvolutionsTest() : M("", Context), TLII(), TLI(TLII) {}
54
55 ScalarEvolution buildSE(Function &F) {
Daniel Jasperaec2fa32016-12-19 08:22:17 +000056 AC.reset(new AssumptionCache(F));
Chandler Carruth2f1fd162015-08-17 02:08:17 +000057 DT.reset(new DominatorTree(F));
58 LI.reset(new LoopInfo(*DT));
Daniel Jasperaec2fa32016-12-19 08:22:17 +000059 return ScalarEvolution(F, TLI, *AC, *DT, *LI);
Chandler Carruth2f1fd162015-08-17 02:08:17 +000060 }
Sanjoy Das6764b9a2016-11-10 07:56:05 +000061
Sanjoy Das044f9562017-04-14 23:47:53 +000062 void runWithSE(
Sanjoy Dasb1227db2016-12-12 14:57:11 +000063 Module &M, StringRef FuncName,
Sanjoy Das044f9562017-04-14 23:47:53 +000064 function_ref<void(Function &F, LoopInfo &LI, ScalarEvolution &SE)> Test) {
Reid Kleckner30422ee2016-12-12 18:52:32 +000065 auto *F = M.getFunction(FuncName);
66 ASSERT_NE(F, nullptr) << "Could not find " << FuncName;
67 ScalarEvolution SE = buildSE(*F);
Sanjoy Das044f9562017-04-14 23:47:53 +000068 Test(*F, *LI, SE);
Sanjoy Das6764b9a2016-11-10 07:56:05 +000069 }
Nick Lewycky287682e2011-10-04 06:51:26 +000070};
Dan Gohman7cac9572010-08-02 23:49:30 +000071
Nick Lewycky287682e2011-10-04 06:51:26 +000072TEST_F(ScalarEvolutionsTest, SCEVUnknownRAUW) {
Chris Lattner229907c2011-07-18 04:54:35 +000073 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
Jay Foadb804a2b2011-07-12 14:06:48 +000074 std::vector<Type *>(), false);
Dan Gohman7cac9572010-08-02 23:49:30 +000075 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
76 BasicBlock *BB = BasicBlock::Create(Context, "entry", F);
Craig Topper66f09ad2014-06-08 22:29:17 +000077 ReturnInst::Create(Context, nullptr, BB);
Dan Gohman7cac9572010-08-02 23:49:30 +000078
Chris Lattner229907c2011-07-18 04:54:35 +000079 Type *Ty = Type::getInt1Ty(Context);
Dan Gohman7cac9572010-08-02 23:49:30 +000080 Constant *Init = Constant::getNullValue(Ty);
81 Value *V0 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V0");
82 Value *V1 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V1");
83 Value *V2 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V2");
84
Chandler Carruth2f1fd162015-08-17 02:08:17 +000085 ScalarEvolution SE = buildSE(*F);
Dan Gohman7cac9572010-08-02 23:49:30 +000086
87 const SCEV *S0 = SE.getSCEV(V0);
88 const SCEV *S1 = SE.getSCEV(V1);
89 const SCEV *S2 = SE.getSCEV(V2);
90
91 const SCEV *P0 = SE.getAddExpr(S0, S0);
92 const SCEV *P1 = SE.getAddExpr(S1, S1);
93 const SCEV *P2 = SE.getAddExpr(S2, S2);
94
95 const SCEVMulExpr *M0 = cast<SCEVMulExpr>(P0);
96 const SCEVMulExpr *M1 = cast<SCEVMulExpr>(P1);
97 const SCEVMulExpr *M2 = cast<SCEVMulExpr>(P2);
98
99 EXPECT_EQ(cast<SCEVConstant>(M0->getOperand(0))->getValue()->getZExtValue(),
100 2u);
101 EXPECT_EQ(cast<SCEVConstant>(M1->getOperand(0))->getValue()->getZExtValue(),
102 2u);
103 EXPECT_EQ(cast<SCEVConstant>(M2->getOperand(0))->getValue()->getZExtValue(),
104 2u);
105
106 // Before the RAUWs, these are all pointing to separate values.
107 EXPECT_EQ(cast<SCEVUnknown>(M0->getOperand(1))->getValue(), V0);
108 EXPECT_EQ(cast<SCEVUnknown>(M1->getOperand(1))->getValue(), V1);
109 EXPECT_EQ(cast<SCEVUnknown>(M2->getOperand(1))->getValue(), V2);
110
111 // Do some RAUWs.
112 V2->replaceAllUsesWith(V1);
113 V1->replaceAllUsesWith(V0);
114
115 // After the RAUWs, these should all be pointing to V0.
116 EXPECT_EQ(cast<SCEVUnknown>(M0->getOperand(1))->getValue(), V0);
117 EXPECT_EQ(cast<SCEVUnknown>(M1->getOperand(1))->getValue(), V0);
118 EXPECT_EQ(cast<SCEVUnknown>(M2->getOperand(1))->getValue(), V0);
Nick Lewycky287682e2011-10-04 06:51:26 +0000119}
Dan Gohman7cac9572010-08-02 23:49:30 +0000120
Tobias Grosser11332e52016-02-21 17:42:10 +0000121TEST_F(ScalarEvolutionsTest, SimplifiedPHI) {
122 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
123 std::vector<Type *>(), false);
124 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
125 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
126 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
127 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
128 BranchInst::Create(LoopBB, EntryBB);
129 BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
130 LoopBB);
131 ReturnInst::Create(Context, nullptr, ExitBB);
132 auto *Ty = Type::getInt32Ty(Context);
133 auto *PN = PHINode::Create(Ty, 2, "", &*LoopBB->begin());
134 PN->addIncoming(Constant::getNullValue(Ty), EntryBB);
135 PN->addIncoming(UndefValue::get(Ty), LoopBB);
136 ScalarEvolution SE = buildSE(*F);
137 auto *S1 = SE.getSCEV(PN);
138 auto *S2 = SE.getSCEV(PN);
Tobias Grosser946ca0a2016-02-22 07:20:40 +0000139 auto *ZeroConst = SE.getConstant(Ty, 0);
Tobias Grosser11332e52016-02-21 17:42:10 +0000140
141 // At some point, only the first call to getSCEV returned the simplified
142 // SCEVConstant and later calls just returned a SCEVUnknown referencing the
143 // PHI node.
Tobias Grosser946ca0a2016-02-22 07:20:40 +0000144 EXPECT_EQ(S1, ZeroConst);
145 EXPECT_EQ(S1, S2);
Tobias Grosser11332e52016-02-21 17:42:10 +0000146}
147
Wei Mi3076cc32016-09-15 04:06:44 +0000148TEST_F(ScalarEvolutionsTest, ExpandPtrTypeSCEV) {
149 // It is to test the fix for PR30213. It exercises the branch in scev
150 // expansion when the value in ValueOffsetPair is a ptr and the offset
151 // is not divisible by the elem type size of value.
152 auto *I8Ty = Type::getInt8Ty(Context);
153 auto *I8PtrTy = Type::getInt8PtrTy(Context);
154 auto *I32Ty = Type::getInt32Ty(Context);
155 auto *I32PtrTy = Type::getInt32PtrTy(Context);
156 FunctionType *FTy =
157 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
158 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
159 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
160 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
161 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
162 BranchInst::Create(LoopBB, EntryBB);
163 ReturnInst::Create(Context, nullptr, ExitBB);
164
165 // loop: ; preds = %loop, %entry
166 // %alloca = alloca i32
167 // %gep0 = getelementptr i32, i32* %alloca, i32 1
168 // %bitcast1 = bitcast i32* %gep0 to i8*
169 // %gep1 = getelementptr i8, i8* %bitcast1, i32 1
170 // %gep2 = getelementptr i8, i8* undef, i32 1
171 // %cmp = icmp ult i8* undef, %bitcast1
172 // %select = select i1 %cmp, i8* %gep1, i8* %gep2
173 // %bitcast2 = bitcast i8* %select to i32*
174 // br i1 undef, label %loop, label %exit
175
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000176 const DataLayout &DL = F->getParent()->getDataLayout();
Wei Mi3076cc32016-09-15 04:06:44 +0000177 BranchInst *Br = BranchInst::Create(
178 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
Matt Arsenault3c1fc762017-04-10 22:27:50 +0000179 AllocaInst *Alloca = new AllocaInst(I32Ty, DL.getAllocaAddrSpace(),
180 "alloca", Br);
Wei Mi3076cc32016-09-15 04:06:44 +0000181 ConstantInt *Ci32 = ConstantInt::get(Context, APInt(32, 1));
182 GetElementPtrInst *Gep0 =
183 GetElementPtrInst::Create(I32Ty, Alloca, Ci32, "gep0", Br);
184 CastInst *CastA =
185 CastInst::CreateBitOrPointerCast(Gep0, I8PtrTy, "bitcast1", Br);
186 GetElementPtrInst *Gep1 =
187 GetElementPtrInst::Create(I8Ty, CastA, Ci32, "gep1", Br);
188 GetElementPtrInst *Gep2 = GetElementPtrInst::Create(
189 I8Ty, UndefValue::get(I8PtrTy), Ci32, "gep2", Br);
190 CmpInst *Cmp = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_ULT,
191 UndefValue::get(I8PtrTy), CastA, "cmp", Br);
192 SelectInst *Sel = SelectInst::Create(Cmp, Gep1, Gep2, "select", Br);
193 CastInst *CastB =
194 CastInst::CreateBitOrPointerCast(Sel, I32PtrTy, "bitcast2", Br);
195
196 ScalarEvolution SE = buildSE(*F);
197 auto *S = SE.getSCEV(CastB);
198 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
199 Value *V =
200 Exp.expandCodeFor(cast<SCEVAddExpr>(S)->getOperand(1), nullptr, Br);
201
202 // Expect the expansion code contains:
203 // %0 = bitcast i32* %bitcast2 to i8*
204 // %uglygep = getelementptr i8, i8* %0, i64 -1
205 // %1 = bitcast i8* %uglygep to i32*
206 EXPECT_TRUE(isa<BitCastInst>(V));
207 Instruction *Gep = cast<Instruction>(V)->getPrevNode();
208 EXPECT_TRUE(isa<GetElementPtrInst>(Gep));
209 EXPECT_TRUE(isa<ConstantInt>(Gep->getOperand(1)));
210 EXPECT_EQ(cast<ConstantInt>(Gep->getOperand(1))->getSExtValue(), -1);
211 EXPECT_TRUE(isa<BitCastInst>(Gep->getPrevNode()));
212}
213
Sanjoy Dasb53021d2016-10-30 23:52:50 +0000214static Instruction *getInstructionByName(Function &F, StringRef Name) {
215 for (auto &I : instructions(F))
216 if (I.getName() == Name)
217 return &I;
Sanjoy Das507dd402016-10-18 17:45:16 +0000218 llvm_unreachable("Expected to find instruction!");
219}
220
221TEST_F(ScalarEvolutionsTest, CommutativeExprOperandOrder) {
222 LLVMContext C;
223 SMDiagnostic Err;
224 std::unique_ptr<Module> M = parseAssemblyString(
225 "target datalayout = \"e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128\" "
Sanjoy Dasb53021d2016-10-30 23:52:50 +0000226 " "
Sanjoy Das299e6722016-10-30 23:52:56 +0000227 "@var_0 = external global i32, align 4"
228 "@var_1 = external global i32, align 4"
Sanjoy Dasfd080902016-10-31 03:32:45 +0000229 "@var_2 = external global i32, align 4"
Sanjoy Das299e6722016-10-30 23:52:56 +0000230 " "
Sanjoy Das17078692016-10-31 03:32:43 +0000231 "declare i32 @unknown(i32, i32, i32)"
232 " "
Sanjoy Dasb53021d2016-10-30 23:52:50 +0000233 "define void @f_1(i8* nocapture %arr, i32 %n, i32* %A, i32* %B) "
Sanjoy Das507dd402016-10-18 17:45:16 +0000234 " local_unnamed_addr { "
235 "entry: "
236 " %entrycond = icmp sgt i32 %n, 0 "
237 " br i1 %entrycond, label %loop.ph, label %for.end "
238 " "
239 "loop.ph: "
240 " %a = load i32, i32* %A, align 4 "
241 " %b = load i32, i32* %B, align 4 "
242 " %mul = mul nsw i32 %b, %a "
243 " %iv0.init = getelementptr inbounds i8, i8* %arr, i32 %mul "
244 " br label %loop "
245 " "
246 "loop: "
247 " %iv0 = phi i8* [ %iv0.inc, %loop ], [ %iv0.init, %loop.ph ] "
248 " %iv1 = phi i32 [ %iv1.inc, %loop ], [ 0, %loop.ph ] "
249 " %conv = trunc i32 %iv1 to i8 "
250 " store i8 %conv, i8* %iv0, align 1 "
251 " %iv0.inc = getelementptr inbounds i8, i8* %iv0, i32 %b "
252 " %iv1.inc = add nuw nsw i32 %iv1, 1 "
253 " %exitcond = icmp eq i32 %iv1.inc, %n "
254 " br i1 %exitcond, label %for.end.loopexit, label %loop "
255 " "
256 "for.end.loopexit: "
257 " br label %for.end "
258 " "
259 "for.end: "
260 " ret void "
261 "} "
262 " "
Sanjoy Dasb53021d2016-10-30 23:52:50 +0000263 "define void @f_2(i32* %X, i32* %Y, i32* %Z) { "
Sanjoy Das507dd402016-10-18 17:45:16 +0000264 " %x = load i32, i32* %X "
265 " %y = load i32, i32* %Y "
266 " %z = load i32, i32* %Z "
267 " ret void "
Sanjoy Das299e6722016-10-30 23:52:56 +0000268 "} "
269 " "
Sanjoy Das299e6722016-10-30 23:52:56 +0000270 "define void @f_3() { "
271 " %x = load i32, i32* @var_0"
272 " %y = load i32, i32* @var_1"
Sanjoy Dasfd080902016-10-31 03:32:45 +0000273 " %z = load i32, i32* @var_2"
Sanjoy Das299e6722016-10-30 23:52:56 +0000274 " ret void"
275 "} "
Sanjoy Das17078692016-10-31 03:32:43 +0000276 " "
277 "define void @f_4(i32 %a, i32 %b, i32 %c) { "
278 " %x = call i32 @unknown(i32 %a, i32 %b, i32 %c)"
279 " %y = call i32 @unknown(i32 %b, i32 %c, i32 %a)"
280 " %z = call i32 @unknown(i32 %c, i32 %a, i32 %b)"
281 " ret void"
282 "} "
Sanjoy Das299e6722016-10-30 23:52:56 +0000283 ,
Sanjoy Das507dd402016-10-18 17:45:16 +0000284 Err, C);
285
286 assert(M && "Could not parse module?");
287 assert(!verifyModule(*M) && "Must have been well formed!");
288
Sanjoy Das044f9562017-04-14 23:47:53 +0000289 runWithSE(*M, "f_1", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
Sanjoy Das3d6e3df2016-10-31 03:32:39 +0000290 auto *IV0 = getInstructionByName(F, "iv0");
291 auto *IV0Inc = getInstructionByName(F, "iv0.inc");
Sanjoy Das507dd402016-10-18 17:45:16 +0000292
Sanjoy Das507dd402016-10-18 17:45:16 +0000293 auto *FirstExprForIV0 = SE.getSCEV(IV0);
294 auto *FirstExprForIV0Inc = SE.getSCEV(IV0Inc);
295 auto *SecondExprForIV0 = SE.getSCEV(IV0);
296
297 EXPECT_TRUE(isa<SCEVAddRecExpr>(FirstExprForIV0));
298 EXPECT_TRUE(isa<SCEVAddRecExpr>(FirstExprForIV0Inc));
299 EXPECT_TRUE(isa<SCEVAddRecExpr>(SecondExprForIV0));
Sanjoy Das3d6e3df2016-10-31 03:32:39 +0000300 });
Sanjoy Das507dd402016-10-18 17:45:16 +0000301
Sanjoy Das17078692016-10-31 03:32:43 +0000302 auto CheckCommutativeMulExprs = [&](ScalarEvolution &SE, const SCEV *A,
303 const SCEV *B, const SCEV *C) {
304 EXPECT_EQ(SE.getMulExpr(A, B), SE.getMulExpr(B, A));
305 EXPECT_EQ(SE.getMulExpr(B, C), SE.getMulExpr(C, B));
306 EXPECT_EQ(SE.getMulExpr(A, C), SE.getMulExpr(C, A));
Sanjoy Das507dd402016-10-18 17:45:16 +0000307
Sanjoy Das17078692016-10-31 03:32:43 +0000308 SmallVector<const SCEV *, 3> Ops0 = {A, B, C};
309 SmallVector<const SCEV *, 3> Ops1 = {A, C, B};
310 SmallVector<const SCEV *, 3> Ops2 = {B, A, C};
311 SmallVector<const SCEV *, 3> Ops3 = {B, C, A};
312 SmallVector<const SCEV *, 3> Ops4 = {C, B, A};
313 SmallVector<const SCEV *, 3> Ops5 = {C, A, B};
Sanjoy Das507dd402016-10-18 17:45:16 +0000314
315 auto *Mul0 = SE.getMulExpr(Ops0);
316 auto *Mul1 = SE.getMulExpr(Ops1);
317 auto *Mul2 = SE.getMulExpr(Ops2);
318 auto *Mul3 = SE.getMulExpr(Ops3);
319 auto *Mul4 = SE.getMulExpr(Ops4);
320 auto *Mul5 = SE.getMulExpr(Ops5);
321
Sanjoy Das17078692016-10-31 03:32:43 +0000322 EXPECT_EQ(Mul0, Mul1) << "Expected " << *Mul0 << " == " << *Mul1;
323 EXPECT_EQ(Mul1, Mul2) << "Expected " << *Mul1 << " == " << *Mul2;
324 EXPECT_EQ(Mul2, Mul3) << "Expected " << *Mul2 << " == " << *Mul3;
325 EXPECT_EQ(Mul3, Mul4) << "Expected " << *Mul3 << " == " << *Mul4;
326 EXPECT_EQ(Mul4, Mul5) << "Expected " << *Mul4 << " == " << *Mul5;
327 };
328
Sanjoy Dasfd080902016-10-31 03:32:45 +0000329 for (StringRef FuncName : {"f_2", "f_3", "f_4"})
Sanjoy Das044f9562017-04-14 23:47:53 +0000330 runWithSE(
331 *M, FuncName, [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
332 CheckCommutativeMulExprs(SE, SE.getSCEV(getInstructionByName(F, "x")),
333 SE.getSCEV(getInstructionByName(F, "y")),
334 SE.getSCEV(getInstructionByName(F, "z")));
335 });
Sanjoy Das507dd402016-10-18 17:45:16 +0000336}
337
Sanjoy Das1bd479d2017-03-05 23:49:17 +0000338TEST_F(ScalarEvolutionsTest, CompareSCEVComplexity) {
Daniil Fukalov4c3322c2016-11-17 16:07:52 +0000339 FunctionType *FTy =
340 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
341 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
342 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
343 BasicBlock *LoopBB = BasicBlock::Create(Context, "bb1", F);
344 BranchInst::Create(LoopBB, EntryBB);
345
346 auto *Ty = Type::getInt32Ty(Context);
347 SmallVector<Instruction*, 8> Muls(8), Acc(8), NextAcc(8);
348
349 Acc[0] = PHINode::Create(Ty, 2, "", LoopBB);
350 Acc[1] = PHINode::Create(Ty, 2, "", LoopBB);
351 Acc[2] = PHINode::Create(Ty, 2, "", LoopBB);
352 Acc[3] = PHINode::Create(Ty, 2, "", LoopBB);
353 Acc[4] = PHINode::Create(Ty, 2, "", LoopBB);
354 Acc[5] = PHINode::Create(Ty, 2, "", LoopBB);
355 Acc[6] = PHINode::Create(Ty, 2, "", LoopBB);
356 Acc[7] = PHINode::Create(Ty, 2, "", LoopBB);
357
358 for (int i = 0; i < 20; i++) {
359 Muls[0] = BinaryOperator::CreateMul(Acc[0], Acc[0], "", LoopBB);
360 NextAcc[0] = BinaryOperator::CreateAdd(Muls[0], Acc[4], "", LoopBB);
361 Muls[1] = BinaryOperator::CreateMul(Acc[1], Acc[1], "", LoopBB);
362 NextAcc[1] = BinaryOperator::CreateAdd(Muls[1], Acc[5], "", LoopBB);
363 Muls[2] = BinaryOperator::CreateMul(Acc[2], Acc[2], "", LoopBB);
364 NextAcc[2] = BinaryOperator::CreateAdd(Muls[2], Acc[6], "", LoopBB);
365 Muls[3] = BinaryOperator::CreateMul(Acc[3], Acc[3], "", LoopBB);
366 NextAcc[3] = BinaryOperator::CreateAdd(Muls[3], Acc[7], "", LoopBB);
367
368 Muls[4] = BinaryOperator::CreateMul(Acc[4], Acc[4], "", LoopBB);
369 NextAcc[4] = BinaryOperator::CreateAdd(Muls[4], Acc[0], "", LoopBB);
370 Muls[5] = BinaryOperator::CreateMul(Acc[5], Acc[5], "", LoopBB);
371 NextAcc[5] = BinaryOperator::CreateAdd(Muls[5], Acc[1], "", LoopBB);
372 Muls[6] = BinaryOperator::CreateMul(Acc[6], Acc[6], "", LoopBB);
373 NextAcc[6] = BinaryOperator::CreateAdd(Muls[6], Acc[2], "", LoopBB);
374 Muls[7] = BinaryOperator::CreateMul(Acc[7], Acc[7], "", LoopBB);
375 NextAcc[7] = BinaryOperator::CreateAdd(Muls[7], Acc[3], "", LoopBB);
376 Acc = NextAcc;
377 }
378
379 auto II = LoopBB->begin();
380 for (int i = 0; i < 8; i++) {
381 PHINode *Phi = cast<PHINode>(&*II++);
382 Phi->addIncoming(Acc[i], LoopBB);
383 Phi->addIncoming(UndefValue::get(Ty), EntryBB);
384 }
385
386 BasicBlock *ExitBB = BasicBlock::Create(Context, "bb2", F);
387 BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
388 LoopBB);
389
390 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
391 Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
392 Acc[2] = BinaryOperator::CreateAdd(Acc[4], Acc[5], "", ExitBB);
393 Acc[3] = BinaryOperator::CreateAdd(Acc[6], Acc[7], "", ExitBB);
394 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
395 Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
396 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
397
398 ReturnInst::Create(Context, nullptr, ExitBB);
399
400 ScalarEvolution SE = buildSE(*F);
401
402 EXPECT_NE(nullptr, SE.getSCEV(Acc[0]));
403}
404
Sanjoy Das1bd479d2017-03-05 23:49:17 +0000405TEST_F(ScalarEvolutionsTest, CompareValueComplexity) {
406 IntegerType *IntPtrTy = M.getDataLayout().getIntPtrType(Context);
407 PointerType *IntPtrPtrTy = IntPtrTy->getPointerTo();
408
409 FunctionType *FTy =
410 FunctionType::get(Type::getVoidTy(Context), {IntPtrTy, IntPtrTy}, false);
411 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
412 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
413
414 Value *X = &*F->arg_begin();
415 Value *Y = &*std::next(F->arg_begin());
416
417 const int ValueDepth = 10;
418 for (int i = 0; i < ValueDepth; i++) {
419 X = new LoadInst(new IntToPtrInst(X, IntPtrPtrTy, "", EntryBB), "",
420 /*isVolatile*/ false, EntryBB);
421 Y = new LoadInst(new IntToPtrInst(Y, IntPtrPtrTy, "", EntryBB), "",
422 /*isVolatile*/ false, EntryBB);
423 }
424
425 auto *MulA = BinaryOperator::CreateMul(X, Y, "", EntryBB);
426 auto *MulB = BinaryOperator::CreateMul(Y, X, "", EntryBB);
427 ReturnInst::Create(Context, nullptr, EntryBB);
428
429 // This test isn't checking for correctness. Today making A and B resolve to
430 // the same SCEV would require deeper searching in CompareValueComplexity,
431 // which will slow down compilation. However, this test can fail (with LLVM's
432 // behavior still being correct) if we ever have a smarter
433 // CompareValueComplexity that is both fast and more accurate.
434
435 ScalarEvolution SE = buildSE(*F);
436 auto *A = SE.getSCEV(MulA);
437 auto *B = SE.getSCEV(MulB);
438 EXPECT_NE(A, B);
439}
440
Daniil Fukalov6378bdb2017-02-06 12:38:06 +0000441TEST_F(ScalarEvolutionsTest, SCEVAddExpr) {
442 Type *Ty32 = Type::getInt32Ty(Context);
443 Type *ArgTys[] = {Type::getInt64Ty(Context), Ty32};
444
445 FunctionType *FTy =
446 FunctionType::get(Type::getVoidTy(Context), ArgTys, false);
447 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
448
449 Argument *A1 = &*F->arg_begin();
450 Argument *A2 = &*(std::next(F->arg_begin()));
451 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
452
453 Instruction *Trunc = CastInst::CreateTruncOrBitCast(A1, Ty32, "", EntryBB);
454 Instruction *Mul1 = BinaryOperator::CreateMul(Trunc, A2, "", EntryBB);
455 Instruction *Add1 = BinaryOperator::CreateAdd(Mul1, Trunc, "", EntryBB);
456 Mul1 = BinaryOperator::CreateMul(Add1, Trunc, "", EntryBB);
457 Instruction *Add2 = BinaryOperator::CreateAdd(Mul1, Add1, "", EntryBB);
Chandler Carruthcd07efc2017-02-06 21:27:12 +0000458 // FIXME: The size of this is arbitrary and doesn't seem to change the
459 // result, but SCEV will do quadratic work for these so a large number here
460 // will be extremely slow. We should revisit what and how this is testing
461 // SCEV.
462 for (int i = 0; i < 10; i++) {
Daniil Fukalov6378bdb2017-02-06 12:38:06 +0000463 Mul1 = BinaryOperator::CreateMul(Add2, Add1, "", EntryBB);
464 Add1 = Add2;
465 Add2 = BinaryOperator::CreateAdd(Mul1, Add1, "", EntryBB);
466 }
467
468 ReturnInst::Create(Context, nullptr, EntryBB);
469 ScalarEvolution SE = buildSE(*F);
470 EXPECT_NE(nullptr, SE.getSCEV(Mul1));
471}
472
Sanjoy Dasb600d3f2017-04-14 15:50:04 +0000473static Instruction &GetInstByName(Function &F, StringRef Name) {
474 for (auto &I : instructions(F))
475 if (I.getName() == Name)
476 return I;
477 llvm_unreachable("Could not find instructions!");
478}
479
480TEST_F(ScalarEvolutionsTest, SCEVNormalization) {
481 LLVMContext C;
482 SMDiagnostic Err;
483 std::unique_ptr<Module> M = parseAssemblyString(
484 "target datalayout = \"e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128\" "
485 " "
486 "@var_0 = external global i32, align 4"
487 "@var_1 = external global i32, align 4"
488 "@var_2 = external global i32, align 4"
489 " "
490 "declare i32 @unknown(i32, i32, i32)"
491 " "
492 "define void @f_1(i8* nocapture %arr, i32 %n, i32* %A, i32* %B) "
493 " local_unnamed_addr { "
494 "entry: "
495 " br label %loop.ph "
496 " "
497 "loop.ph: "
498 " br label %loop "
499 " "
500 "loop: "
501 " %iv0 = phi i32 [ %iv0.inc, %loop ], [ 0, %loop.ph ] "
502 " %iv1 = phi i32 [ %iv1.inc, %loop ], [ -2147483648, %loop.ph ] "
503 " %iv0.inc = add i32 %iv0, 1 "
504 " %iv1.inc = add i32 %iv1, 3 "
505 " br i1 undef, label %for.end.loopexit, label %loop "
506 " "
507 "for.end.loopexit: "
508 " ret void "
509 "} "
Sanjoy Dasbbebcb62017-04-25 00:09:19 +0000510 " "
511 "define void @f_2(i32 %a, i32 %b, i32 %c, i32 %d) "
512 " local_unnamed_addr { "
513 "entry: "
514 " br label %loop_0 "
515 " "
516 "loop_0: "
517 " br i1 undef, label %loop_0, label %loop_1 "
518 " "
519 "loop_1: "
520 " br i1 undef, label %loop_2, label %loop_1 "
521 " "
522 " "
523 "loop_2: "
524 " br i1 undef, label %end, label %loop_2 "
525 " "
526 "end: "
527 " ret void "
528 "} "
Sanjoy Dasb600d3f2017-04-14 15:50:04 +0000529 ,
530 Err, C);
531
532 assert(M && "Could not parse module?");
533 assert(!verifyModule(*M) && "Must have been well formed!");
534
Sanjoy Das044f9562017-04-14 23:47:53 +0000535 runWithSE(*M, "f_1", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
Sanjoy Dasb600d3f2017-04-14 15:50:04 +0000536 auto &I0 = GetInstByName(F, "iv0");
537 auto &I1 = *I0.getNextNode();
538
539 auto *S0 = cast<SCEVAddRecExpr>(SE.getSCEV(&I0));
540 PostIncLoopSet Loops;
541 Loops.insert(S0->getLoop());
542 auto *N0 = normalizeForPostIncUse(S0, Loops, SE);
543 auto *D0 = denormalizeForPostIncUse(N0, Loops, SE);
544 EXPECT_EQ(S0, D0) << *S0 << " " << *D0;
545
546 auto *S1 = cast<SCEVAddRecExpr>(SE.getSCEV(&I1));
547 Loops.clear();
548 Loops.insert(S1->getLoop());
549 auto *N1 = normalizeForPostIncUse(S1, Loops, SE);
550 auto *D1 = denormalizeForPostIncUse(N1, Loops, SE);
551 EXPECT_EQ(S1, D1) << *S1 << " " << *D1;
552 });
Sanjoy Dasbbebcb62017-04-25 00:09:19 +0000553
554 runWithSE(*M, "f_2", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
555 auto *L2 = *LI.begin();
556 auto *L1 = *std::next(LI.begin());
557 auto *L0 = *std::next(LI.begin(), 2);
558
559 auto GetAddRec = [&SE](const Loop *L, std::initializer_list<const SCEV *> Ops) {
560 SmallVector<const SCEV *, 4> OpsCopy(Ops);
561 return SE.getAddRecExpr(OpsCopy, L, SCEV::FlagAnyWrap);
562 };
563
564 auto GetAdd = [&SE](std::initializer_list<const SCEV *> Ops) {
565 SmallVector<const SCEV *, 4> OpsCopy(Ops);
566 return SE.getAddExpr(OpsCopy, SCEV::FlagAnyWrap);
567 };
568
569 // We first populate the AddRecs vector with a few "interesting" SCEV
570 // expressions, and then we go through the list and assert that each
571 // expression in it has an invertible normalization.
572
573 std::vector<const SCEV *> Exprs;
574 {
575 const SCEV *V0 = SE.getSCEV(&*F.arg_begin());
576 const SCEV *V1 = SE.getSCEV(&*std::next(F.arg_begin(), 1));
577 const SCEV *V2 = SE.getSCEV(&*std::next(F.arg_begin(), 2));
578 const SCEV *V3 = SE.getSCEV(&*std::next(F.arg_begin(), 3));
579
580 Exprs.push_back(GetAddRec(L0, {V0})); // 0
581 Exprs.push_back(GetAddRec(L0, {V0, V1})); // 1
582 Exprs.push_back(GetAddRec(L0, {V0, V1, V2})); // 2
583 Exprs.push_back(GetAddRec(L0, {V0, V1, V2, V3})); // 3
584
585 Exprs.push_back(
586 GetAddRec(L1, {Exprs[1], Exprs[2], Exprs[3], Exprs[0]})); // 4
587 Exprs.push_back(
588 GetAddRec(L1, {Exprs[1], Exprs[2], Exprs[0], Exprs[3]})); // 5
589 Exprs.push_back(
590 GetAddRec(L1, {Exprs[1], Exprs[3], Exprs[3], Exprs[1]})); // 6
591
592 Exprs.push_back(GetAdd({Exprs[6], Exprs[3], V2})); // 7
593
594 Exprs.push_back(
595 GetAddRec(L2, {Exprs[4], Exprs[3], Exprs[3], Exprs[5]})); // 8
596
597 Exprs.push_back(
598 GetAddRec(L2, {Exprs[4], Exprs[6], Exprs[7], Exprs[3], V0})); // 9
599 }
600
601 std::vector<PostIncLoopSet> LoopSets;
602 for (int i = 0; i < 8; i++) {
603 LoopSets.emplace_back();
604 if (i & 1)
605 LoopSets.back().insert(L0);
606 if (i & 2)
607 LoopSets.back().insert(L1);
608 if (i & 4)
609 LoopSets.back().insert(L2);
610 }
611
612 for (const auto &LoopSet : LoopSets)
613 for (auto *S : Exprs) {
614 {
615 auto *N = llvm::normalizeForPostIncUse(S, LoopSet, SE);
616 auto *D = llvm::denormalizeForPostIncUse(N, LoopSet, SE);
617
618 // Normalization and then denormalizing better give us back the same
619 // value.
620 EXPECT_EQ(S, D) << "S = " << *S << " D = " << *D << " N = " << *N;
621 }
622 {
623 auto *D = llvm::denormalizeForPostIncUse(S, LoopSet, SE);
624 auto *N = llvm::normalizeForPostIncUse(D, LoopSet, SE);
625
626 // Denormalization and then normalizing better give us back the same
627 // value.
628 EXPECT_EQ(S, N) << "S = " << *S << " N = " << *N;
629 }
630 }
631 });
Sanjoy Dasb600d3f2017-04-14 15:50:04 +0000632}
633
Wei Mi8c405332017-04-17 20:40:05 +0000634// Expect the call of getZeroExtendExpr will not cost exponential time.
635TEST_F(ScalarEvolutionsTest, SCEVZeroExtendExpr) {
636 LLVMContext C;
637 SMDiagnostic Err;
638
639 // Generate a function like below:
640 // define void @foo() {
641 // entry:
642 // br label %for.cond
643 //
644 // for.cond:
645 // %0 = phi i64 [ 100, %entry ], [ %dec, %for.inc ]
646 // %cmp = icmp sgt i64 %0, 90
647 // br i1 %cmp, label %for.inc, label %for.cond1
648 //
649 // for.inc:
650 // %dec = add nsw i64 %0, -1
651 // br label %for.cond
652 //
653 // for.cond1:
654 // %1 = phi i64 [ 100, %for.cond ], [ %dec5, %for.inc2 ]
655 // %cmp3 = icmp sgt i64 %1, 90
656 // br i1 %cmp3, label %for.inc2, label %for.cond4
657 //
658 // for.inc2:
659 // %dec5 = add nsw i64 %1, -1
660 // br label %for.cond1
661 //
662 // ......
663 //
664 // for.cond89:
665 // %19 = phi i64 [ 100, %for.cond84 ], [ %dec94, %for.inc92 ]
666 // %cmp93 = icmp sgt i64 %19, 90
667 // br i1 %cmp93, label %for.inc92, label %for.end
668 //
669 // for.inc92:
670 // %dec94 = add nsw i64 %19, -1
671 // br label %for.cond89
672 //
673 // for.end:
674 // %gep = getelementptr i8, i8* null, i64 %dec
675 // %gep6 = getelementptr i8, i8* %gep, i64 %dec5
676 // ......
677 // %gep95 = getelementptr i8, i8* %gep91, i64 %dec94
678 // ret void
679 // }
680 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), {}, false);
681 Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy));
682
683 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
684 BasicBlock *CondBB = BasicBlock::Create(Context, "for.cond", F);
685 BasicBlock *EndBB = BasicBlock::Create(Context, "for.end", F);
686 BranchInst::Create(CondBB, EntryBB);
687 BasicBlock *PrevBB = EntryBB;
688
689 Type *I64Ty = Type::getInt64Ty(Context);
690 Type *I8Ty = Type::getInt8Ty(Context);
691 Type *I8PtrTy = Type::getInt8PtrTy(Context);
692 Value *Accum = Constant::getNullValue(I8PtrTy);
693 int Iters = 20;
694 for (int i = 0; i < Iters; i++) {
695 BasicBlock *IncBB = BasicBlock::Create(Context, "for.inc", F, EndBB);
696 auto *PN = PHINode::Create(I64Ty, 2, "", CondBB);
697 PN->addIncoming(ConstantInt::get(Context, APInt(64, 100)), PrevBB);
698 auto *Cmp = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_SGT, PN,
699 ConstantInt::get(Context, APInt(64, 90)), "cmp",
700 CondBB);
701 BasicBlock *NextBB;
702 if (i != Iters - 1)
703 NextBB = BasicBlock::Create(Context, "for.cond", F, EndBB);
704 else
705 NextBB = EndBB;
706 BranchInst::Create(IncBB, NextBB, Cmp, CondBB);
707 auto *Dec = BinaryOperator::CreateNSWAdd(
708 PN, ConstantInt::get(Context, APInt(64, -1)), "dec", IncBB);
709 PN->addIncoming(Dec, IncBB);
710 BranchInst::Create(CondBB, IncBB);
711
712 Accum = GetElementPtrInst::Create(I8Ty, Accum, Dec, "gep", EndBB);
713
714 PrevBB = CondBB;
715 CondBB = NextBB;
716 }
717 ReturnInst::Create(Context, nullptr, EndBB);
718 ScalarEvolution SE = buildSE(*F);
719 const SCEV *S = SE.getSCEV(Accum);
720 Type *I128Ty = Type::getInt128Ty(Context);
721 SE.getZeroExtendExpr(S, I128Ty);
722}
Keno Fischer090f1952017-05-27 03:22:55 +0000723
724// Make sure that SCEV doesn't introduce illegal ptrtoint/inttoptr instructions
725TEST_F(ScalarEvolutionsTest, SCEVZeroExtendExprNonIntegral) {
726 /*
727 * Create the following code:
728 * func(i64 addrspace(10)* %arg)
729 * top:
730 * br label %L.ph
731 * L.ph:
732 * br label %L
733 * L:
734 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
735 * %add = add i64 %phi2, 1
736 * br i1 undef, label %post, label %L2
737 * post:
738 * %gepbase = getelementptr i64 addrspace(10)* %arg, i64 1
739 * #= %gep = getelementptr i64 addrspace(10)* %gepbase, i64 %add =#
740 * ret void
741 *
742 * We will create the appropriate SCEV expression for %gep and expand it,
743 * then check that no inttoptr/ptrtoint instructions got inserted.
744 */
745
746 // Create a module with non-integral pointers in it's datalayout
747 Module NIM("nonintegral", Context);
748 std::string DataLayout = M.getDataLayoutStr();
749 if (!DataLayout.empty())
750 DataLayout += "-";
751 DataLayout += "ni:10";
752 NIM.setDataLayout(DataLayout);
753
754 Type *T_int1 = Type::getInt1Ty(Context);
755 Type *T_int64 = Type::getInt64Ty(Context);
756 Type *T_pint64 = T_int64->getPointerTo(10);
757
758 FunctionType *FTy =
759 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
760 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
761
762 Argument *Arg = &*F->arg_begin();
763
764 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
765 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
766 BasicBlock *L = BasicBlock::Create(Context, "L", F);
767 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
768
769 IRBuilder<> Builder(Top);
770 Builder.CreateBr(LPh);
771
772 Builder.SetInsertPoint(LPh);
773 Builder.CreateBr(L);
774
775 Builder.SetInsertPoint(L);
776 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
777 Value *Add = Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add");
778 Builder.CreateCondBr(UndefValue::get(T_int1), L, Post);
779 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
780 Phi->addIncoming(Add, L);
781
782 Builder.SetInsertPoint(Post);
Gor Nishanove5d29112017-05-27 05:24:30 +0000783 Value *GepBase = Builder.CreateGEP(Arg, ConstantInt::get(T_int64, 1));
Keno Fischer090f1952017-05-27 03:22:55 +0000784 Instruction *Ret = Builder.CreateRetVoid();
785
786 ScalarEvolution SE = buildSE(*F);
787 auto *AddRec =
788 SE.getAddRecExpr(SE.getUnknown(GepBase), SE.getConstant(T_int64, 1),
789 LI->getLoopFor(L), SCEV::FlagNUW);
790
791 SCEVExpander Exp(SE, NIM.getDataLayout(), "expander");
792 Exp.disableCanonicalMode();
793 Exp.expandCodeFor(AddRec, T_pint64, Ret);
794
795 // Make sure none of the instructions inserted were inttoptr/ptrtoint.
796 // The verifier will check this.
797 EXPECT_FALSE(verifyFunction(*F, &errs()));
798}
799
Max Kazantsev2cb36532017-08-03 08:41:30 +0000800// Make sure that SCEV invalidates exit limits after invalidating the values it
801// depends on when we forget a loop.
802TEST_F(ScalarEvolutionsTest, SCEVExitLimitForgetLoop) {
803 /*
804 * Create the following code:
805 * func(i64 addrspace(10)* %arg)
806 * top:
807 * br label %L.ph
808 * L.ph:
809 * br label %L
810 * L:
811 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
812 * %add = add i64 %phi2, 1
813 * %cond = icmp slt i64 %add, 1000; then becomes 2000.
814 * br i1 %cond, label %post, label %L2
815 * post:
816 * ret void
817 *
818 */
819
820 // Create a module with non-integral pointers in it's datalayout
821 Module NIM("nonintegral", Context);
822 std::string DataLayout = M.getDataLayoutStr();
823 if (!DataLayout.empty())
824 DataLayout += "-";
825 DataLayout += "ni:10";
826 NIM.setDataLayout(DataLayout);
827
828 Type *T_int64 = Type::getInt64Ty(Context);
829 Type *T_pint64 = T_int64->getPointerTo(10);
830
831 FunctionType *FTy =
832 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
833 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
834
Max Kazantsev2cb36532017-08-03 08:41:30 +0000835 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
836 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
837 BasicBlock *L = BasicBlock::Create(Context, "L", F);
838 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
839
840 IRBuilder<> Builder(Top);
841 Builder.CreateBr(LPh);
842
843 Builder.SetInsertPoint(LPh);
844 Builder.CreateBr(L);
845
846 Builder.SetInsertPoint(L);
847 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
848 auto *Add = cast<Instruction>(
849 Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add"));
850 auto *Limit = ConstantInt::get(T_int64, 1000);
851 auto *Cond = cast<Instruction>(
852 Builder.CreateICmp(ICmpInst::ICMP_SLT, Add, Limit, "cond"));
853 auto *Br = cast<Instruction>(Builder.CreateCondBr(Cond, L, Post));
854 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
855 Phi->addIncoming(Add, L);
856
857 Builder.SetInsertPoint(Post);
858 Builder.CreateRetVoid();
859
860 ScalarEvolution SE = buildSE(*F);
861 auto *Loop = LI->getLoopFor(L);
862 const SCEV *EC = SE.getBackedgeTakenCount(Loop);
863 EXPECT_FALSE(isa<SCEVCouldNotCompute>(EC));
Max Kazantsevba1e70e2017-08-04 05:06:44 +0000864 EXPECT_TRUE(isa<SCEVConstant>(EC));
Max Kazantsev6e724762017-08-04 06:03:51 +0000865 EXPECT_EQ(cast<SCEVConstant>(EC)->getAPInt().getLimitedValue(), 999u);
Max Kazantsev2cb36532017-08-03 08:41:30 +0000866
Sanjoy Dase6b995f2017-10-13 05:50:52 +0000867 // The add recurrence {5,+,1} does not correspond to any PHI in the IR, and
868 // that is relevant to this test.
869 auto *Five = SE.getConstant(APInt(/*numBits=*/64, 5));
870 auto *AR =
871 SE.getAddRecExpr(Five, SE.getOne(T_int64), Loop, SCEV::FlagAnyWrap);
872 const SCEV *ARAtLoopExit = SE.getSCEVAtScope(AR, nullptr);
873 EXPECT_FALSE(isa<SCEVCouldNotCompute>(ARAtLoopExit));
874 EXPECT_TRUE(isa<SCEVConstant>(ARAtLoopExit));
875 EXPECT_EQ(cast<SCEVConstant>(ARAtLoopExit)->getAPInt().getLimitedValue(),
876 1004u);
877
Max Kazantsev2cb36532017-08-03 08:41:30 +0000878 SE.forgetLoop(Loop);
879 Br->eraseFromParent();
880 Cond->eraseFromParent();
881
882 Builder.SetInsertPoint(L);
Benjamin Kramera73b4102017-08-03 15:59:37 +0000883 auto *NewCond = Builder.CreateICmp(
884 ICmpInst::ICMP_SLT, Add, ConstantInt::get(T_int64, 2000), "new.cond");
885 Builder.CreateCondBr(NewCond, L, Post);
Max Kazantsev2cb36532017-08-03 08:41:30 +0000886 const SCEV *NewEC = SE.getBackedgeTakenCount(Loop);
Max Kazantsevba1e70e2017-08-04 05:06:44 +0000887 EXPECT_FALSE(isa<SCEVCouldNotCompute>(NewEC));
888 EXPECT_TRUE(isa<SCEVConstant>(NewEC));
Max Kazantsev6e724762017-08-04 06:03:51 +0000889 EXPECT_EQ(cast<SCEVConstant>(NewEC)->getAPInt().getLimitedValue(), 1999u);
Sanjoy Dase6b995f2017-10-13 05:50:52 +0000890 const SCEV *NewARAtLoopExit = SE.getSCEVAtScope(AR, nullptr);
891 EXPECT_FALSE(isa<SCEVCouldNotCompute>(NewARAtLoopExit));
892 EXPECT_TRUE(isa<SCEVConstant>(NewARAtLoopExit));
893 EXPECT_EQ(cast<SCEVConstant>(NewARAtLoopExit)->getAPInt().getLimitedValue(),
894 2004u);
Max Kazantsev2cb36532017-08-03 08:41:30 +0000895}
896
Daniel Neilson3f0e4ad2017-09-05 19:54:03 +0000897TEST_F(ScalarEvolutionsTest, SCEVAddRecFromPHIwithLargeConstants) {
898 // Reference: https://reviews.llvm.org/D37265
899 // Make sure that SCEV does not blow up when constructing an AddRec
900 // with predicates for a phi with the update pattern:
901 // (SExt/ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy) + InvariantAccum
902 // when either the initial value of the Phi or the InvariantAccum are
903 // constants that are too large to fit in an ix but are zero when truncated to
904 // ix.
905 FunctionType *FTy =
906 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
907 Function *F = cast<Function>(M.getOrInsertFunction("addrecphitest", FTy));
908
909 /*
910 Create IR:
911 entry:
912 br label %loop
913 loop:
914 %0 = phi i64 [-9223372036854775808, %entry], [%3, %loop]
915 %1 = shl i64 %0, 32
916 %2 = ashr exact i64 %1, 32
917 %3 = add i64 %2, -9223372036854775808
918 br i1 undef, label %exit, label %loop
919 exit:
920 ret void
921 */
922 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
923 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
924 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
925
926 // entry:
927 BranchInst::Create(LoopBB, EntryBB);
928 // loop:
929 auto *MinInt64 =
930 ConstantInt::get(Context, APInt(64, 0x8000000000000000U, true));
931 auto *Int64_32 = ConstantInt::get(Context, APInt(64, 32));
932 auto *Br = BranchInst::Create(
933 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
934 auto *Phi = PHINode::Create(Type::getInt64Ty(Context), 2, "", Br);
935 auto *Shl = BinaryOperator::CreateShl(Phi, Int64_32, "", Br);
936 auto *AShr = BinaryOperator::CreateExactAShr(Shl, Int64_32, "", Br);
937 auto *Add = BinaryOperator::CreateAdd(AShr, MinInt64, "", Br);
938 Phi->addIncoming(MinInt64, EntryBB);
939 Phi->addIncoming(Add, LoopBB);
940 // exit:
941 ReturnInst::Create(Context, nullptr, ExitBB);
942
943 // Make sure that SCEV doesn't blow up
944 ScalarEvolution SE = buildSE(*F);
945 SCEVUnionPredicate Preds;
946 const SCEV *Expr = SE.getSCEV(Phi);
947 EXPECT_NE(nullptr, Expr);
948 EXPECT_TRUE(isa<SCEVUnknown>(Expr));
949 auto Result = SE.createAddRecFromPHIWithCasts(cast<SCEVUnknown>(Expr));
950}
951
Daniel Neilson5acfd1d2017-10-11 19:05:14 +0000952TEST_F(ScalarEvolutionsTest, SCEVAddRecFromPHIwithLargeConstantAccum) {
953 // Make sure that SCEV does not blow up when constructing an AddRec
954 // with predicates for a phi with the update pattern:
955 // (SExt/ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy) + InvariantAccum
956 // when the InvariantAccum is a constant that is too large to fit in an
957 // ix but are zero when truncated to ix, and the initial value of the
958 // phi is not a constant.
959 Type *Int32Ty = Type::getInt32Ty(Context);
960 SmallVector<Type *, 1> Types;
961 Types.push_back(Int32Ty);
962 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), Types, false);
963 Function *F = cast<Function>(M.getOrInsertFunction("addrecphitest", FTy));
964
965 /*
966 Create IR:
967 define @addrecphitest(i32)
968 entry:
969 br label %loop
970 loop:
971 %1 = phi i32 [%0, %entry], [%4, %loop]
972 %2 = shl i32 %1, 16
973 %3 = ashr exact i32 %2, 16
974 %4 = add i32 %3, -2147483648
975 br i1 undef, label %exit, label %loop
976 exit:
977 ret void
978 */
979 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
980 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
981 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
982
983 // entry:
984 BranchInst::Create(LoopBB, EntryBB);
985 // loop:
986 auto *MinInt32 = ConstantInt::get(Context, APInt(32, 0x80000000U, true));
987 auto *Int32_16 = ConstantInt::get(Context, APInt(32, 16));
988 auto *Br = BranchInst::Create(
989 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
990 auto *Phi = PHINode::Create(Int32Ty, 2, "", Br);
991 auto *Shl = BinaryOperator::CreateShl(Phi, Int32_16, "", Br);
992 auto *AShr = BinaryOperator::CreateExactAShr(Shl, Int32_16, "", Br);
993 auto *Add = BinaryOperator::CreateAdd(AShr, MinInt32, "", Br);
994 auto *Arg = &*(F->arg_begin());
995 Phi->addIncoming(Arg, EntryBB);
996 Phi->addIncoming(Add, LoopBB);
997 // exit:
998 ReturnInst::Create(Context, nullptr, ExitBB);
999
1000 // Make sure that SCEV doesn't blow up
1001 ScalarEvolution SE = buildSE(*F);
1002 SCEVUnionPredicate Preds;
1003 const SCEV *Expr = SE.getSCEV(Phi);
1004 EXPECT_NE(nullptr, Expr);
1005 EXPECT_TRUE(isa<SCEVUnknown>(Expr));
1006 auto Result = SE.createAddRecFromPHIWithCasts(cast<SCEVUnknown>(Expr));
1007}
1008
Sanjoy Dasc70a7a02017-10-13 17:13:44 +00001009TEST_F(ScalarEvolutionsTest, SCEVForgetDependentLoop) {
1010 LLVMContext C;
1011 SMDiagnostic Err;
1012 std::unique_ptr<Module> M = parseAssemblyString(
1013 "target datalayout = \"e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128\" "
1014 " "
1015 "define void @f(i32 %first_limit, i1* %cond) { "
1016 "entry: "
1017 " br label %first_loop.ph "
1018 " "
1019 "first_loop.ph: "
1020 " br label %first_loop "
1021 " "
1022 "first_loop: "
1023 " %iv_first = phi i32 [0, %first_loop.ph], [%iv_first.inc, %first_loop] "
1024 " %iv_first.inc = add i32 %iv_first, 1 "
1025 " %known_cond = icmp slt i32 %iv_first, 2000 "
1026 " %unknown_cond = load volatile i1, i1* %cond "
1027 " br i1 %unknown_cond, label %first_loop, label %first_loop.exit "
1028 " "
1029 "first_loop.exit: "
1030 " %iv_first.3x = mul i32 %iv_first, 3 "
1031 " %iv_first.5x = mul i32 %iv_first, 5 "
1032 " br label %second_loop.ph "
1033 " "
1034 "second_loop.ph: "
1035 " br label %second_loop "
1036 " "
1037 "second_loop: "
1038 " %iv_second = phi i32 [%iv_first.3x, %second_loop.ph], [%iv_second.inc, %second_loop] "
1039 " %iv_second.inc = add i32 %iv_second, 1 "
1040 " %second_loop.cond = icmp ne i32 %iv_second, %iv_first.5x "
1041 " br i1 %second_loop.cond, label %second_loop, label %second_loop.exit "
1042 " "
1043 "second_loop.exit: "
1044 " ret void "
1045 "} "
1046 " ",
1047 Err, C);
1048
1049 assert(M && "Could not parse module?");
1050 assert(!verifyModule(*M) && "Must have been well formed!");
1051
1052 runWithSE(*M, "f", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
1053 auto &FirstIV = GetInstByName(F, "iv_first");
1054 auto &SecondIV = GetInstByName(F, "iv_second");
1055
1056 auto *FirstLoop = LI.getLoopFor(FirstIV.getParent());
1057 auto *SecondLoop = LI.getLoopFor(SecondIV.getParent());
1058
1059 auto *Zero = SE.getZero(FirstIV.getType());
1060 auto *Two = SE.getConstant(APInt(32, 2));
1061
1062 EXPECT_EQ(SE.getBackedgeTakenCount(FirstLoop), SE.getCouldNotCompute());
1063 EXPECT_THAT(SE.getBackedgeTakenCount(SecondLoop),
1064 IsAffineAddRec(Zero, Two, FirstLoop));
1065
1066 auto &UnknownCond = GetInstByName(F, "unknown_cond");
1067 auto &KnownCond = GetInstByName(F, "known_cond");
1068
1069 UnknownCond.replaceAllUsesWith(&KnownCond);
1070
1071 SE.forgetLoop(FirstLoop);
1072
1073 EXPECT_EQ(SE.getBackedgeTakenCount(FirstLoop), SE.getConstant(APInt(32, 2000)));
1074 EXPECT_EQ(SE.getBackedgeTakenCount(SecondLoop), SE.getConstant(APInt(32, 4000)));
1075 });
1076}
1077
Daniel Neilson1341ac22017-09-22 15:47:57 +00001078TEST_F(ScalarEvolutionsTest, SCEVFoldSumOfTruncs) {
1079 // Verify that the following SCEV gets folded to a zero:
1080 // (-1 * (trunc i64 (-1 * %0) to i32)) + (-1 * (trunc i64 %0 to i32)
1081 Type *ArgTy = Type::getInt64Ty(Context);
1082 Type *Int32Ty = Type::getInt32Ty(Context);
1083 SmallVector<Type *, 1> Types;
1084 Types.push_back(ArgTy);
1085 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), Types, false);
1086 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
1087 BasicBlock *BB = BasicBlock::Create(Context, "entry", F);
1088 ReturnInst::Create(Context, nullptr, BB);
1089
1090 ScalarEvolution SE = buildSE(*F);
1091
1092 auto *Arg = &*(F->arg_begin());
1093 const auto *ArgSCEV = SE.getSCEV(Arg);
1094
1095 // Build the SCEV
1096 const auto *A0 = SE.getNegativeSCEV(ArgSCEV);
1097 const auto *A1 = SE.getTruncateExpr(A0, Int32Ty);
1098 const auto *A = SE.getNegativeSCEV(A1);
1099
1100 const auto *B0 = SE.getTruncateExpr(ArgSCEV, Int32Ty);
1101 const auto *B = SE.getNegativeSCEV(B0);
1102
1103 const auto *Expr = SE.getAddExpr(A, B);
Daniel Neilson1341ac22017-09-22 15:47:57 +00001104 // Verify that the SCEV was folded to 0
1105 const auto *ZeroConst = SE.getConstant(Int32Ty, 0);
1106 EXPECT_EQ(Expr, ZeroConst);
1107}
1108
Dan Gohman7cac9572010-08-02 23:49:30 +00001109} // end anonymous namespace
1110} // end namespace llvm