BuildBot fix, compiler complains about array decay to pointer
[llvm-core.git] / unittests / Analysis / ScalarEvolutionTest.cpp
blob98fc44e4923d27dddba4fe019072d9be5c364d2c
1 //===- 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 //===----------------------------------------------------------------------===//
10 #include "llvm/ADT/SmallVector.h"
11 #include "llvm/Analysis/AssumptionCache.h"
12 #include "llvm/Analysis/LoopInfo.h"
13 #include "llvm/Analysis/ScalarEvolutionExpander.h"
14 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
15 #include "llvm/Analysis/TargetLibraryInfo.h"
16 #include "llvm/AsmParser/Parser.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/Dominators.h"
19 #include "llvm/IR/GlobalVariable.h"
20 #include "llvm/IR/IRBuilder.h"
21 #include "llvm/IR/InstIterator.h"
22 #include "llvm/IR/LLVMContext.h"
23 #include "llvm/IR/LegacyPassManager.h"
24 #include "llvm/IR/Module.h"
25 #include "llvm/IR/Verifier.h"
26 #include "llvm/Support/SourceMgr.h"
27 #include "gtest/gtest.h"
29 namespace llvm {
30 namespace {
32 // We use this fixture to ensure that we clean up ScalarEvolution before
33 // deleting the PassManager.
34 class ScalarEvolutionsTest : public testing::Test {
35 protected:
36 LLVMContext Context;
37 Module M;
38 TargetLibraryInfoImpl TLII;
39 TargetLibraryInfo TLI;
41 std::unique_ptr<AssumptionCache> AC;
42 std::unique_ptr<DominatorTree> DT;
43 std::unique_ptr<LoopInfo> LI;
45 ScalarEvolutionsTest() : M("", Context), TLII(), TLI(TLII) {}
47 ScalarEvolution buildSE(Function &F) {
48 AC.reset(new AssumptionCache(F));
49 DT.reset(new DominatorTree(F));
50 LI.reset(new LoopInfo(*DT));
51 return ScalarEvolution(F, TLI, *AC, *DT, *LI);
54 void runWithSE(
55 Module &M, StringRef FuncName,
56 function_ref<void(Function &F, LoopInfo &LI, ScalarEvolution &SE)> Test) {
57 auto *F = M.getFunction(FuncName);
58 ASSERT_NE(F, nullptr) << "Could not find " << FuncName;
59 ScalarEvolution SE = buildSE(*F);
60 Test(*F, *LI, SE);
64 TEST_F(ScalarEvolutionsTest, SCEVUnknownRAUW) {
65 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
66 std::vector<Type *>(), false);
67 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
68 BasicBlock *BB = BasicBlock::Create(Context, "entry", F);
69 ReturnInst::Create(Context, nullptr, BB);
71 Type *Ty = Type::getInt1Ty(Context);
72 Constant *Init = Constant::getNullValue(Ty);
73 Value *V0 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V0");
74 Value *V1 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V1");
75 Value *V2 = new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage, Init, "V2");
77 ScalarEvolution SE = buildSE(*F);
79 const SCEV *S0 = SE.getSCEV(V0);
80 const SCEV *S1 = SE.getSCEV(V1);
81 const SCEV *S2 = SE.getSCEV(V2);
83 const SCEV *P0 = SE.getAddExpr(S0, S0);
84 const SCEV *P1 = SE.getAddExpr(S1, S1);
85 const SCEV *P2 = SE.getAddExpr(S2, S2);
87 const SCEVMulExpr *M0 = cast<SCEVMulExpr>(P0);
88 const SCEVMulExpr *M1 = cast<SCEVMulExpr>(P1);
89 const SCEVMulExpr *M2 = cast<SCEVMulExpr>(P2);
91 EXPECT_EQ(cast<SCEVConstant>(M0->getOperand(0))->getValue()->getZExtValue(),
92 2u);
93 EXPECT_EQ(cast<SCEVConstant>(M1->getOperand(0))->getValue()->getZExtValue(),
94 2u);
95 EXPECT_EQ(cast<SCEVConstant>(M2->getOperand(0))->getValue()->getZExtValue(),
96 2u);
98 // Before the RAUWs, these are all pointing to separate values.
99 EXPECT_EQ(cast<SCEVUnknown>(M0->getOperand(1))->getValue(), V0);
100 EXPECT_EQ(cast<SCEVUnknown>(M1->getOperand(1))->getValue(), V1);
101 EXPECT_EQ(cast<SCEVUnknown>(M2->getOperand(1))->getValue(), V2);
103 // Do some RAUWs.
104 V2->replaceAllUsesWith(V1);
105 V1->replaceAllUsesWith(V0);
107 // After the RAUWs, these should all be pointing to V0.
108 EXPECT_EQ(cast<SCEVUnknown>(M0->getOperand(1))->getValue(), V0);
109 EXPECT_EQ(cast<SCEVUnknown>(M1->getOperand(1))->getValue(), V0);
110 EXPECT_EQ(cast<SCEVUnknown>(M2->getOperand(1))->getValue(), V0);
113 TEST_F(ScalarEvolutionsTest, SimplifiedPHI) {
114 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context),
115 std::vector<Type *>(), false);
116 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
117 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
118 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
119 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
120 BranchInst::Create(LoopBB, EntryBB);
121 BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
122 LoopBB);
123 ReturnInst::Create(Context, nullptr, ExitBB);
124 auto *Ty = Type::getInt32Ty(Context);
125 auto *PN = PHINode::Create(Ty, 2, "", &*LoopBB->begin());
126 PN->addIncoming(Constant::getNullValue(Ty), EntryBB);
127 PN->addIncoming(UndefValue::get(Ty), LoopBB);
128 ScalarEvolution SE = buildSE(*F);
129 auto *S1 = SE.getSCEV(PN);
130 auto *S2 = SE.getSCEV(PN);
131 auto *ZeroConst = SE.getConstant(Ty, 0);
133 // At some point, only the first call to getSCEV returned the simplified
134 // SCEVConstant and later calls just returned a SCEVUnknown referencing the
135 // PHI node.
136 EXPECT_EQ(S1, ZeroConst);
137 EXPECT_EQ(S1, S2);
140 TEST_F(ScalarEvolutionsTest, ExpandPtrTypeSCEV) {
141 // It is to test the fix for PR30213. It exercises the branch in scev
142 // expansion when the value in ValueOffsetPair is a ptr and the offset
143 // is not divisible by the elem type size of value.
144 auto *I8Ty = Type::getInt8Ty(Context);
145 auto *I8PtrTy = Type::getInt8PtrTy(Context);
146 auto *I32Ty = Type::getInt32Ty(Context);
147 auto *I32PtrTy = Type::getInt32PtrTy(Context);
148 FunctionType *FTy =
149 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
150 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
151 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
152 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
153 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
154 BranchInst::Create(LoopBB, EntryBB);
155 ReturnInst::Create(Context, nullptr, ExitBB);
157 // loop: ; preds = %loop, %entry
158 // %alloca = alloca i32
159 // %gep0 = getelementptr i32, i32* %alloca, i32 1
160 // %bitcast1 = bitcast i32* %gep0 to i8*
161 // %gep1 = getelementptr i8, i8* %bitcast1, i32 1
162 // %gep2 = getelementptr i8, i8* undef, i32 1
163 // %cmp = icmp ult i8* undef, %bitcast1
164 // %select = select i1 %cmp, i8* %gep1, i8* %gep2
165 // %bitcast2 = bitcast i8* %select to i32*
166 // br i1 undef, label %loop, label %exit
168 const DataLayout &DL = F->getParent()->getDataLayout();
169 BranchInst *Br = BranchInst::Create(
170 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
171 AllocaInst *Alloca = new AllocaInst(I32Ty, DL.getAllocaAddrSpace(),
172 "alloca", Br);
173 ConstantInt *Ci32 = ConstantInt::get(Context, APInt(32, 1));
174 GetElementPtrInst *Gep0 =
175 GetElementPtrInst::Create(I32Ty, Alloca, Ci32, "gep0", Br);
176 CastInst *CastA =
177 CastInst::CreateBitOrPointerCast(Gep0, I8PtrTy, "bitcast1", Br);
178 GetElementPtrInst *Gep1 =
179 GetElementPtrInst::Create(I8Ty, CastA, Ci32, "gep1", Br);
180 GetElementPtrInst *Gep2 = GetElementPtrInst::Create(
181 I8Ty, UndefValue::get(I8PtrTy), Ci32, "gep2", Br);
182 CmpInst *Cmp = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_ULT,
183 UndefValue::get(I8PtrTy), CastA, "cmp", Br);
184 SelectInst *Sel = SelectInst::Create(Cmp, Gep1, Gep2, "select", Br);
185 CastInst *CastB =
186 CastInst::CreateBitOrPointerCast(Sel, I32PtrTy, "bitcast2", Br);
188 ScalarEvolution SE = buildSE(*F);
189 auto *S = SE.getSCEV(CastB);
190 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
191 Value *V =
192 Exp.expandCodeFor(cast<SCEVAddExpr>(S)->getOperand(1), nullptr, Br);
194 // Expect the expansion code contains:
195 // %0 = bitcast i32* %bitcast2 to i8*
196 // %uglygep = getelementptr i8, i8* %0, i64 -1
197 // %1 = bitcast i8* %uglygep to i32*
198 EXPECT_TRUE(isa<BitCastInst>(V));
199 Instruction *Gep = cast<Instruction>(V)->getPrevNode();
200 EXPECT_TRUE(isa<GetElementPtrInst>(Gep));
201 EXPECT_TRUE(isa<ConstantInt>(Gep->getOperand(1)));
202 EXPECT_EQ(cast<ConstantInt>(Gep->getOperand(1))->getSExtValue(), -1);
203 EXPECT_TRUE(isa<BitCastInst>(Gep->getPrevNode()));
206 static Instruction *getInstructionByName(Function &F, StringRef Name) {
207 for (auto &I : instructions(F))
208 if (I.getName() == Name)
209 return &I;
210 llvm_unreachable("Expected to find instruction!");
213 TEST_F(ScalarEvolutionsTest, CommutativeExprOperandOrder) {
214 LLVMContext C;
215 SMDiagnostic Err;
216 std::unique_ptr<Module> M = parseAssemblyString(
217 "target datalayout = \"e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128\" "
219 "@var_0 = external global i32, align 4"
220 "@var_1 = external global i32, align 4"
221 "@var_2 = external global i32, align 4"
223 "declare i32 @unknown(i32, i32, i32)"
225 "define void @f_1(i8* nocapture %arr, i32 %n, i32* %A, i32* %B) "
226 " local_unnamed_addr { "
227 "entry: "
228 " %entrycond = icmp sgt i32 %n, 0 "
229 " br i1 %entrycond, label %loop.ph, label %for.end "
231 "loop.ph: "
232 " %a = load i32, i32* %A, align 4 "
233 " %b = load i32, i32* %B, align 4 "
234 " %mul = mul nsw i32 %b, %a "
235 " %iv0.init = getelementptr inbounds i8, i8* %arr, i32 %mul "
236 " br label %loop "
238 "loop: "
239 " %iv0 = phi i8* [ %iv0.inc, %loop ], [ %iv0.init, %loop.ph ] "
240 " %iv1 = phi i32 [ %iv1.inc, %loop ], [ 0, %loop.ph ] "
241 " %conv = trunc i32 %iv1 to i8 "
242 " store i8 %conv, i8* %iv0, align 1 "
243 " %iv0.inc = getelementptr inbounds i8, i8* %iv0, i32 %b "
244 " %iv1.inc = add nuw nsw i32 %iv1, 1 "
245 " %exitcond = icmp eq i32 %iv1.inc, %n "
246 " br i1 %exitcond, label %for.end.loopexit, label %loop "
248 "for.end.loopexit: "
249 " br label %for.end "
251 "for.end: "
252 " ret void "
253 "} "
255 "define void @f_2(i32* %X, i32* %Y, i32* %Z) { "
256 " %x = load i32, i32* %X "
257 " %y = load i32, i32* %Y "
258 " %z = load i32, i32* %Z "
259 " ret void "
260 "} "
262 "define void @f_3() { "
263 " %x = load i32, i32* @var_0"
264 " %y = load i32, i32* @var_1"
265 " %z = load i32, i32* @var_2"
266 " ret void"
267 "} "
269 "define void @f_4(i32 %a, i32 %b, i32 %c) { "
270 " %x = call i32 @unknown(i32 %a, i32 %b, i32 %c)"
271 " %y = call i32 @unknown(i32 %b, i32 %c, i32 %a)"
272 " %z = call i32 @unknown(i32 %c, i32 %a, i32 %b)"
273 " ret void"
274 "} "
276 Err, C);
278 assert(M && "Could not parse module?");
279 assert(!verifyModule(*M) && "Must have been well formed!");
281 runWithSE(*M, "f_1", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
282 auto *IV0 = getInstructionByName(F, "iv0");
283 auto *IV0Inc = getInstructionByName(F, "iv0.inc");
285 auto *FirstExprForIV0 = SE.getSCEV(IV0);
286 auto *FirstExprForIV0Inc = SE.getSCEV(IV0Inc);
287 auto *SecondExprForIV0 = SE.getSCEV(IV0);
289 EXPECT_TRUE(isa<SCEVAddRecExpr>(FirstExprForIV0));
290 EXPECT_TRUE(isa<SCEVAddRecExpr>(FirstExprForIV0Inc));
291 EXPECT_TRUE(isa<SCEVAddRecExpr>(SecondExprForIV0));
294 auto CheckCommutativeMulExprs = [&](ScalarEvolution &SE, const SCEV *A,
295 const SCEV *B, const SCEV *C) {
296 EXPECT_EQ(SE.getMulExpr(A, B), SE.getMulExpr(B, A));
297 EXPECT_EQ(SE.getMulExpr(B, C), SE.getMulExpr(C, B));
298 EXPECT_EQ(SE.getMulExpr(A, C), SE.getMulExpr(C, A));
300 SmallVector<const SCEV *, 3> Ops0 = {A, B, C};
301 SmallVector<const SCEV *, 3> Ops1 = {A, C, B};
302 SmallVector<const SCEV *, 3> Ops2 = {B, A, C};
303 SmallVector<const SCEV *, 3> Ops3 = {B, C, A};
304 SmallVector<const SCEV *, 3> Ops4 = {C, B, A};
305 SmallVector<const SCEV *, 3> Ops5 = {C, A, B};
307 auto *Mul0 = SE.getMulExpr(Ops0);
308 auto *Mul1 = SE.getMulExpr(Ops1);
309 auto *Mul2 = SE.getMulExpr(Ops2);
310 auto *Mul3 = SE.getMulExpr(Ops3);
311 auto *Mul4 = SE.getMulExpr(Ops4);
312 auto *Mul5 = SE.getMulExpr(Ops5);
314 EXPECT_EQ(Mul0, Mul1) << "Expected " << *Mul0 << " == " << *Mul1;
315 EXPECT_EQ(Mul1, Mul2) << "Expected " << *Mul1 << " == " << *Mul2;
316 EXPECT_EQ(Mul2, Mul3) << "Expected " << *Mul2 << " == " << *Mul3;
317 EXPECT_EQ(Mul3, Mul4) << "Expected " << *Mul3 << " == " << *Mul4;
318 EXPECT_EQ(Mul4, Mul5) << "Expected " << *Mul4 << " == " << *Mul5;
321 for (StringRef FuncName : {"f_2", "f_3", "f_4"})
322 runWithSE(
323 *M, FuncName, [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
324 CheckCommutativeMulExprs(SE, SE.getSCEV(getInstructionByName(F, "x")),
325 SE.getSCEV(getInstructionByName(F, "y")),
326 SE.getSCEV(getInstructionByName(F, "z")));
330 TEST_F(ScalarEvolutionsTest, CompareSCEVComplexity) {
331 FunctionType *FTy =
332 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
333 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
334 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
335 BasicBlock *LoopBB = BasicBlock::Create(Context, "bb1", F);
336 BranchInst::Create(LoopBB, EntryBB);
338 auto *Ty = Type::getInt32Ty(Context);
339 SmallVector<Instruction*, 8> Muls(8), Acc(8), NextAcc(8);
341 Acc[0] = PHINode::Create(Ty, 2, "", LoopBB);
342 Acc[1] = PHINode::Create(Ty, 2, "", LoopBB);
343 Acc[2] = PHINode::Create(Ty, 2, "", LoopBB);
344 Acc[3] = PHINode::Create(Ty, 2, "", LoopBB);
345 Acc[4] = PHINode::Create(Ty, 2, "", LoopBB);
346 Acc[5] = PHINode::Create(Ty, 2, "", LoopBB);
347 Acc[6] = PHINode::Create(Ty, 2, "", LoopBB);
348 Acc[7] = PHINode::Create(Ty, 2, "", LoopBB);
350 for (int i = 0; i < 20; i++) {
351 Muls[0] = BinaryOperator::CreateMul(Acc[0], Acc[0], "", LoopBB);
352 NextAcc[0] = BinaryOperator::CreateAdd(Muls[0], Acc[4], "", LoopBB);
353 Muls[1] = BinaryOperator::CreateMul(Acc[1], Acc[1], "", LoopBB);
354 NextAcc[1] = BinaryOperator::CreateAdd(Muls[1], Acc[5], "", LoopBB);
355 Muls[2] = BinaryOperator::CreateMul(Acc[2], Acc[2], "", LoopBB);
356 NextAcc[2] = BinaryOperator::CreateAdd(Muls[2], Acc[6], "", LoopBB);
357 Muls[3] = BinaryOperator::CreateMul(Acc[3], Acc[3], "", LoopBB);
358 NextAcc[3] = BinaryOperator::CreateAdd(Muls[3], Acc[7], "", LoopBB);
360 Muls[4] = BinaryOperator::CreateMul(Acc[4], Acc[4], "", LoopBB);
361 NextAcc[4] = BinaryOperator::CreateAdd(Muls[4], Acc[0], "", LoopBB);
362 Muls[5] = BinaryOperator::CreateMul(Acc[5], Acc[5], "", LoopBB);
363 NextAcc[5] = BinaryOperator::CreateAdd(Muls[5], Acc[1], "", LoopBB);
364 Muls[6] = BinaryOperator::CreateMul(Acc[6], Acc[6], "", LoopBB);
365 NextAcc[6] = BinaryOperator::CreateAdd(Muls[6], Acc[2], "", LoopBB);
366 Muls[7] = BinaryOperator::CreateMul(Acc[7], Acc[7], "", LoopBB);
367 NextAcc[7] = BinaryOperator::CreateAdd(Muls[7], Acc[3], "", LoopBB);
368 Acc = NextAcc;
371 auto II = LoopBB->begin();
372 for (int i = 0; i < 8; i++) {
373 PHINode *Phi = cast<PHINode>(&*II++);
374 Phi->addIncoming(Acc[i], LoopBB);
375 Phi->addIncoming(UndefValue::get(Ty), EntryBB);
378 BasicBlock *ExitBB = BasicBlock::Create(Context, "bb2", F);
379 BranchInst::Create(LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)),
380 LoopBB);
382 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
383 Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
384 Acc[2] = BinaryOperator::CreateAdd(Acc[4], Acc[5], "", ExitBB);
385 Acc[3] = BinaryOperator::CreateAdd(Acc[6], Acc[7], "", ExitBB);
386 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
387 Acc[1] = BinaryOperator::CreateAdd(Acc[2], Acc[3], "", ExitBB);
388 Acc[0] = BinaryOperator::CreateAdd(Acc[0], Acc[1], "", ExitBB);
390 ReturnInst::Create(Context, nullptr, ExitBB);
392 ScalarEvolution SE = buildSE(*F);
394 EXPECT_NE(nullptr, SE.getSCEV(Acc[0]));
397 TEST_F(ScalarEvolutionsTest, CompareValueComplexity) {
398 IntegerType *IntPtrTy = M.getDataLayout().getIntPtrType(Context);
399 PointerType *IntPtrPtrTy = IntPtrTy->getPointerTo();
401 FunctionType *FTy =
402 FunctionType::get(Type::getVoidTy(Context), {IntPtrTy, IntPtrTy}, false);
403 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
404 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
406 Value *X = &*F->arg_begin();
407 Value *Y = &*std::next(F->arg_begin());
409 const int ValueDepth = 10;
410 for (int i = 0; i < ValueDepth; i++) {
411 X = new LoadInst(new IntToPtrInst(X, IntPtrPtrTy, "", EntryBB), "",
412 /*isVolatile*/ false, EntryBB);
413 Y = new LoadInst(new IntToPtrInst(Y, IntPtrPtrTy, "", EntryBB), "",
414 /*isVolatile*/ false, EntryBB);
417 auto *MulA = BinaryOperator::CreateMul(X, Y, "", EntryBB);
418 auto *MulB = BinaryOperator::CreateMul(Y, X, "", EntryBB);
419 ReturnInst::Create(Context, nullptr, EntryBB);
421 // This test isn't checking for correctness. Today making A and B resolve to
422 // the same SCEV would require deeper searching in CompareValueComplexity,
423 // which will slow down compilation. However, this test can fail (with LLVM's
424 // behavior still being correct) if we ever have a smarter
425 // CompareValueComplexity that is both fast and more accurate.
427 ScalarEvolution SE = buildSE(*F);
428 auto *A = SE.getSCEV(MulA);
429 auto *B = SE.getSCEV(MulB);
430 EXPECT_NE(A, B);
433 TEST_F(ScalarEvolutionsTest, SCEVAddExpr) {
434 Type *Ty32 = Type::getInt32Ty(Context);
435 Type *ArgTys[] = {Type::getInt64Ty(Context), Ty32};
437 FunctionType *FTy =
438 FunctionType::get(Type::getVoidTy(Context), ArgTys, false);
439 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
441 Argument *A1 = &*F->arg_begin();
442 Argument *A2 = &*(std::next(F->arg_begin()));
443 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
445 Instruction *Trunc = CastInst::CreateTruncOrBitCast(A1, Ty32, "", EntryBB);
446 Instruction *Mul1 = BinaryOperator::CreateMul(Trunc, A2, "", EntryBB);
447 Instruction *Add1 = BinaryOperator::CreateAdd(Mul1, Trunc, "", EntryBB);
448 Mul1 = BinaryOperator::CreateMul(Add1, Trunc, "", EntryBB);
449 Instruction *Add2 = BinaryOperator::CreateAdd(Mul1, Add1, "", EntryBB);
450 // FIXME: The size of this is arbitrary and doesn't seem to change the
451 // result, but SCEV will do quadratic work for these so a large number here
452 // will be extremely slow. We should revisit what and how this is testing
453 // SCEV.
454 for (int i = 0; i < 10; i++) {
455 Mul1 = BinaryOperator::CreateMul(Add2, Add1, "", EntryBB);
456 Add1 = Add2;
457 Add2 = BinaryOperator::CreateAdd(Mul1, Add1, "", EntryBB);
460 ReturnInst::Create(Context, nullptr, EntryBB);
461 ScalarEvolution SE = buildSE(*F);
462 EXPECT_NE(nullptr, SE.getSCEV(Mul1));
465 static Instruction &GetInstByName(Function &F, StringRef Name) {
466 for (auto &I : instructions(F))
467 if (I.getName() == Name)
468 return I;
469 llvm_unreachable("Could not find instructions!");
472 TEST_F(ScalarEvolutionsTest, SCEVNormalization) {
473 LLVMContext C;
474 SMDiagnostic Err;
475 std::unique_ptr<Module> M = parseAssemblyString(
476 "target datalayout = \"e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128\" "
478 "@var_0 = external global i32, align 4"
479 "@var_1 = external global i32, align 4"
480 "@var_2 = external global i32, align 4"
482 "declare i32 @unknown(i32, i32, i32)"
484 "define void @f_1(i8* nocapture %arr, i32 %n, i32* %A, i32* %B) "
485 " local_unnamed_addr { "
486 "entry: "
487 " br label %loop.ph "
489 "loop.ph: "
490 " br label %loop "
492 "loop: "
493 " %iv0 = phi i32 [ %iv0.inc, %loop ], [ 0, %loop.ph ] "
494 " %iv1 = phi i32 [ %iv1.inc, %loop ], [ -2147483648, %loop.ph ] "
495 " %iv0.inc = add i32 %iv0, 1 "
496 " %iv1.inc = add i32 %iv1, 3 "
497 " br i1 undef, label %for.end.loopexit, label %loop "
499 "for.end.loopexit: "
500 " ret void "
501 "} "
503 "define void @f_2(i32 %a, i32 %b, i32 %c, i32 %d) "
504 " local_unnamed_addr { "
505 "entry: "
506 " br label %loop_0 "
508 "loop_0: "
509 " br i1 undef, label %loop_0, label %loop_1 "
511 "loop_1: "
512 " br i1 undef, label %loop_2, label %loop_1 "
515 "loop_2: "
516 " br i1 undef, label %end, label %loop_2 "
518 "end: "
519 " ret void "
520 "} "
522 Err, C);
524 assert(M && "Could not parse module?");
525 assert(!verifyModule(*M) && "Must have been well formed!");
527 runWithSE(*M, "f_1", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
528 auto &I0 = GetInstByName(F, "iv0");
529 auto &I1 = *I0.getNextNode();
531 auto *S0 = cast<SCEVAddRecExpr>(SE.getSCEV(&I0));
532 PostIncLoopSet Loops;
533 Loops.insert(S0->getLoop());
534 auto *N0 = normalizeForPostIncUse(S0, Loops, SE);
535 auto *D0 = denormalizeForPostIncUse(N0, Loops, SE);
536 EXPECT_EQ(S0, D0) << *S0 << " " << *D0;
538 auto *S1 = cast<SCEVAddRecExpr>(SE.getSCEV(&I1));
539 Loops.clear();
540 Loops.insert(S1->getLoop());
541 auto *N1 = normalizeForPostIncUse(S1, Loops, SE);
542 auto *D1 = denormalizeForPostIncUse(N1, Loops, SE);
543 EXPECT_EQ(S1, D1) << *S1 << " " << *D1;
546 runWithSE(*M, "f_2", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
547 auto *L2 = *LI.begin();
548 auto *L1 = *std::next(LI.begin());
549 auto *L0 = *std::next(LI.begin(), 2);
551 auto GetAddRec = [&SE](const Loop *L, std::initializer_list<const SCEV *> Ops) {
552 SmallVector<const SCEV *, 4> OpsCopy(Ops);
553 return SE.getAddRecExpr(OpsCopy, L, SCEV::FlagAnyWrap);
556 auto GetAdd = [&SE](std::initializer_list<const SCEV *> Ops) {
557 SmallVector<const SCEV *, 4> OpsCopy(Ops);
558 return SE.getAddExpr(OpsCopy, SCEV::FlagAnyWrap);
561 // We first populate the AddRecs vector with a few "interesting" SCEV
562 // expressions, and then we go through the list and assert that each
563 // expression in it has an invertible normalization.
565 std::vector<const SCEV *> Exprs;
567 const SCEV *V0 = SE.getSCEV(&*F.arg_begin());
568 const SCEV *V1 = SE.getSCEV(&*std::next(F.arg_begin(), 1));
569 const SCEV *V2 = SE.getSCEV(&*std::next(F.arg_begin(), 2));
570 const SCEV *V3 = SE.getSCEV(&*std::next(F.arg_begin(), 3));
572 Exprs.push_back(GetAddRec(L0, {V0})); // 0
573 Exprs.push_back(GetAddRec(L0, {V0, V1})); // 1
574 Exprs.push_back(GetAddRec(L0, {V0, V1, V2})); // 2
575 Exprs.push_back(GetAddRec(L0, {V0, V1, V2, V3})); // 3
577 Exprs.push_back(
578 GetAddRec(L1, {Exprs[1], Exprs[2], Exprs[3], Exprs[0]})); // 4
579 Exprs.push_back(
580 GetAddRec(L1, {Exprs[1], Exprs[2], Exprs[0], Exprs[3]})); // 5
581 Exprs.push_back(
582 GetAddRec(L1, {Exprs[1], Exprs[3], Exprs[3], Exprs[1]})); // 6
584 Exprs.push_back(GetAdd({Exprs[6], Exprs[3], V2})); // 7
586 Exprs.push_back(
587 GetAddRec(L2, {Exprs[4], Exprs[3], Exprs[3], Exprs[5]})); // 8
589 Exprs.push_back(
590 GetAddRec(L2, {Exprs[4], Exprs[6], Exprs[7], Exprs[3], V0})); // 9
593 std::vector<PostIncLoopSet> LoopSets;
594 for (int i = 0; i < 8; i++) {
595 LoopSets.emplace_back();
596 if (i & 1)
597 LoopSets.back().insert(L0);
598 if (i & 2)
599 LoopSets.back().insert(L1);
600 if (i & 4)
601 LoopSets.back().insert(L2);
604 for (const auto &LoopSet : LoopSets)
605 for (auto *S : Exprs) {
607 auto *N = llvm::normalizeForPostIncUse(S, LoopSet, SE);
608 auto *D = llvm::denormalizeForPostIncUse(N, LoopSet, SE);
610 // Normalization and then denormalizing better give us back the same
611 // value.
612 EXPECT_EQ(S, D) << "S = " << *S << " D = " << *D << " N = " << *N;
615 auto *D = llvm::denormalizeForPostIncUse(S, LoopSet, SE);
616 auto *N = llvm::normalizeForPostIncUse(D, LoopSet, SE);
618 // Denormalization and then normalizing better give us back the same
619 // value.
620 EXPECT_EQ(S, N) << "S = " << *S << " N = " << *N;
626 // Expect the call of getZeroExtendExpr will not cost exponential time.
627 TEST_F(ScalarEvolutionsTest, SCEVZeroExtendExpr) {
628 LLVMContext C;
629 SMDiagnostic Err;
631 // Generate a function like below:
632 // define void @foo() {
633 // entry:
634 // br label %for.cond
636 // for.cond:
637 // %0 = phi i64 [ 100, %entry ], [ %dec, %for.inc ]
638 // %cmp = icmp sgt i64 %0, 90
639 // br i1 %cmp, label %for.inc, label %for.cond1
641 // for.inc:
642 // %dec = add nsw i64 %0, -1
643 // br label %for.cond
645 // for.cond1:
646 // %1 = phi i64 [ 100, %for.cond ], [ %dec5, %for.inc2 ]
647 // %cmp3 = icmp sgt i64 %1, 90
648 // br i1 %cmp3, label %for.inc2, label %for.cond4
650 // for.inc2:
651 // %dec5 = add nsw i64 %1, -1
652 // br label %for.cond1
654 // ......
656 // for.cond89:
657 // %19 = phi i64 [ 100, %for.cond84 ], [ %dec94, %for.inc92 ]
658 // %cmp93 = icmp sgt i64 %19, 90
659 // br i1 %cmp93, label %for.inc92, label %for.end
661 // for.inc92:
662 // %dec94 = add nsw i64 %19, -1
663 // br label %for.cond89
665 // for.end:
666 // %gep = getelementptr i8, i8* null, i64 %dec
667 // %gep6 = getelementptr i8, i8* %gep, i64 %dec5
668 // ......
669 // %gep95 = getelementptr i8, i8* %gep91, i64 %dec94
670 // ret void
671 // }
672 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), {}, false);
673 Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy));
675 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
676 BasicBlock *CondBB = BasicBlock::Create(Context, "for.cond", F);
677 BasicBlock *EndBB = BasicBlock::Create(Context, "for.end", F);
678 BranchInst::Create(CondBB, EntryBB);
679 BasicBlock *PrevBB = EntryBB;
681 Type *I64Ty = Type::getInt64Ty(Context);
682 Type *I8Ty = Type::getInt8Ty(Context);
683 Type *I8PtrTy = Type::getInt8PtrTy(Context);
684 Value *Accum = Constant::getNullValue(I8PtrTy);
685 int Iters = 20;
686 for (int i = 0; i < Iters; i++) {
687 BasicBlock *IncBB = BasicBlock::Create(Context, "for.inc", F, EndBB);
688 auto *PN = PHINode::Create(I64Ty, 2, "", CondBB);
689 PN->addIncoming(ConstantInt::get(Context, APInt(64, 100)), PrevBB);
690 auto *Cmp = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_SGT, PN,
691 ConstantInt::get(Context, APInt(64, 90)), "cmp",
692 CondBB);
693 BasicBlock *NextBB;
694 if (i != Iters - 1)
695 NextBB = BasicBlock::Create(Context, "for.cond", F, EndBB);
696 else
697 NextBB = EndBB;
698 BranchInst::Create(IncBB, NextBB, Cmp, CondBB);
699 auto *Dec = BinaryOperator::CreateNSWAdd(
700 PN, ConstantInt::get(Context, APInt(64, -1)), "dec", IncBB);
701 PN->addIncoming(Dec, IncBB);
702 BranchInst::Create(CondBB, IncBB);
704 Accum = GetElementPtrInst::Create(I8Ty, Accum, Dec, "gep", EndBB);
706 PrevBB = CondBB;
707 CondBB = NextBB;
709 ReturnInst::Create(Context, nullptr, EndBB);
710 ScalarEvolution SE = buildSE(*F);
711 const SCEV *S = SE.getSCEV(Accum);
712 Type *I128Ty = Type::getInt128Ty(Context);
713 SE.getZeroExtendExpr(S, I128Ty);
716 // Make sure that SCEV doesn't introduce illegal ptrtoint/inttoptr instructions
717 TEST_F(ScalarEvolutionsTest, SCEVZeroExtendExprNonIntegral) {
719 * Create the following code:
720 * func(i64 addrspace(10)* %arg)
721 * top:
722 * br label %L.ph
723 * L.ph:
724 * br label %L
725 * L:
726 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
727 * %add = add i64 %phi2, 1
728 * br i1 undef, label %post, label %L2
729 * post:
730 * %gepbase = getelementptr i64 addrspace(10)* %arg, i64 1
731 * #= %gep = getelementptr i64 addrspace(10)* %gepbase, i64 %add =#
732 * ret void
734 * We will create the appropriate SCEV expression for %gep and expand it,
735 * then check that no inttoptr/ptrtoint instructions got inserted.
738 // Create a module with non-integral pointers in it's datalayout
739 Module NIM("nonintegral", Context);
740 std::string DataLayout = M.getDataLayoutStr();
741 if (!DataLayout.empty())
742 DataLayout += "-";
743 DataLayout += "ni:10";
744 NIM.setDataLayout(DataLayout);
746 Type *T_int1 = Type::getInt1Ty(Context);
747 Type *T_int64 = Type::getInt64Ty(Context);
748 Type *T_pint64 = T_int64->getPointerTo(10);
750 FunctionType *FTy =
751 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
752 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
754 Argument *Arg = &*F->arg_begin();
756 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
757 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
758 BasicBlock *L = BasicBlock::Create(Context, "L", F);
759 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
761 IRBuilder<> Builder(Top);
762 Builder.CreateBr(LPh);
764 Builder.SetInsertPoint(LPh);
765 Builder.CreateBr(L);
767 Builder.SetInsertPoint(L);
768 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
769 Value *Add = Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add");
770 Builder.CreateCondBr(UndefValue::get(T_int1), L, Post);
771 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
772 Phi->addIncoming(Add, L);
774 Builder.SetInsertPoint(Post);
775 Value *GepBase = Builder.CreateGEP(Arg, ConstantInt::get(T_int64, 1));
776 Instruction *Ret = Builder.CreateRetVoid();
778 ScalarEvolution SE = buildSE(*F);
779 auto *AddRec =
780 SE.getAddRecExpr(SE.getUnknown(GepBase), SE.getConstant(T_int64, 1),
781 LI->getLoopFor(L), SCEV::FlagNUW);
783 SCEVExpander Exp(SE, NIM.getDataLayout(), "expander");
784 Exp.disableCanonicalMode();
785 Exp.expandCodeFor(AddRec, T_pint64, Ret);
787 // Make sure none of the instructions inserted were inttoptr/ptrtoint.
788 // The verifier will check this.
789 EXPECT_FALSE(verifyFunction(*F, &errs()));
792 // Make sure that SCEV invalidates exit limits after invalidating the values it
793 // depends on when we forget a loop.
794 TEST_F(ScalarEvolutionsTest, SCEVExitLimitForgetLoop) {
796 * Create the following code:
797 * func(i64 addrspace(10)* %arg)
798 * top:
799 * br label %L.ph
800 * L.ph:
801 * br label %L
802 * L:
803 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
804 * %add = add i64 %phi2, 1
805 * %cond = icmp slt i64 %add, 1000; then becomes 2000.
806 * br i1 %cond, label %post, label %L2
807 * post:
808 * ret void
812 // Create a module with non-integral pointers in it's datalayout
813 Module NIM("nonintegral", Context);
814 std::string DataLayout = M.getDataLayoutStr();
815 if (!DataLayout.empty())
816 DataLayout += "-";
817 DataLayout += "ni:10";
818 NIM.setDataLayout(DataLayout);
820 Type *T_int64 = Type::getInt64Ty(Context);
821 Type *T_pint64 = T_int64->getPointerTo(10);
823 FunctionType *FTy =
824 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
825 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
827 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
828 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
829 BasicBlock *L = BasicBlock::Create(Context, "L", F);
830 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
832 IRBuilder<> Builder(Top);
833 Builder.CreateBr(LPh);
835 Builder.SetInsertPoint(LPh);
836 Builder.CreateBr(L);
838 Builder.SetInsertPoint(L);
839 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
840 auto *Add = cast<Instruction>(
841 Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add"));
842 auto *Limit = ConstantInt::get(T_int64, 1000);
843 auto *Cond = cast<Instruction>(
844 Builder.CreateICmp(ICmpInst::ICMP_SLT, Add, Limit, "cond"));
845 auto *Br = cast<Instruction>(Builder.CreateCondBr(Cond, L, Post));
846 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
847 Phi->addIncoming(Add, L);
849 Builder.SetInsertPoint(Post);
850 Builder.CreateRetVoid();
852 ScalarEvolution SE = buildSE(*F);
853 auto *Loop = LI->getLoopFor(L);
854 const SCEV *EC = SE.getBackedgeTakenCount(Loop);
855 EXPECT_FALSE(isa<SCEVCouldNotCompute>(EC));
856 EXPECT_TRUE(isa<SCEVConstant>(EC));
857 EXPECT_EQ(cast<SCEVConstant>(EC)->getAPInt().getLimitedValue(), 999u);
859 // The add recurrence {5,+,1} does not correspond to any PHI in the IR, and
860 // that is relevant to this test.
861 auto *Five = SE.getConstant(APInt(/*numBits=*/64, 5));
862 auto *AR =
863 SE.getAddRecExpr(Five, SE.getOne(T_int64), Loop, SCEV::FlagAnyWrap);
864 const SCEV *ARAtLoopExit = SE.getSCEVAtScope(AR, nullptr);
865 EXPECT_FALSE(isa<SCEVCouldNotCompute>(ARAtLoopExit));
866 EXPECT_TRUE(isa<SCEVConstant>(ARAtLoopExit));
867 EXPECT_EQ(cast<SCEVConstant>(ARAtLoopExit)->getAPInt().getLimitedValue(),
868 1004u);
870 SE.forgetLoop(Loop);
871 Br->eraseFromParent();
872 Cond->eraseFromParent();
874 Builder.SetInsertPoint(L);
875 auto *NewCond = Builder.CreateICmp(
876 ICmpInst::ICMP_SLT, Add, ConstantInt::get(T_int64, 2000), "new.cond");
877 Builder.CreateCondBr(NewCond, L, Post);
878 const SCEV *NewEC = SE.getBackedgeTakenCount(Loop);
879 EXPECT_FALSE(isa<SCEVCouldNotCompute>(NewEC));
880 EXPECT_TRUE(isa<SCEVConstant>(NewEC));
881 EXPECT_EQ(cast<SCEVConstant>(NewEC)->getAPInt().getLimitedValue(), 1999u);
882 const SCEV *NewARAtLoopExit = SE.getSCEVAtScope(AR, nullptr);
883 EXPECT_FALSE(isa<SCEVCouldNotCompute>(NewARAtLoopExit));
884 EXPECT_TRUE(isa<SCEVConstant>(NewARAtLoopExit));
885 EXPECT_EQ(cast<SCEVConstant>(NewARAtLoopExit)->getAPInt().getLimitedValue(),
886 2004u);
889 // Make sure that SCEV invalidates exit limits after invalidating the values it
890 // depends on when we forget a value.
891 TEST_F(ScalarEvolutionsTest, SCEVExitLimitForgetValue) {
893 * Create the following code:
894 * func(i64 addrspace(10)* %arg)
895 * top:
896 * br label %L.ph
897 * L.ph:
898 * %load = load i64 addrspace(10)* %arg
899 * br label %L
900 * L:
901 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
902 * %add = add i64 %phi2, 1
903 * %cond = icmp slt i64 %add, %load ; then becomes 2000.
904 * br i1 %cond, label %post, label %L2
905 * post:
906 * ret void
910 // Create a module with non-integral pointers in it's datalayout
911 Module NIM("nonintegral", Context);
912 std::string DataLayout = M.getDataLayoutStr();
913 if (!DataLayout.empty())
914 DataLayout += "-";
915 DataLayout += "ni:10";
916 NIM.setDataLayout(DataLayout);
918 Type *T_int64 = Type::getInt64Ty(Context);
919 Type *T_pint64 = T_int64->getPointerTo(10);
921 FunctionType *FTy =
922 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
923 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
925 Argument *Arg = &*F->arg_begin();
927 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
928 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
929 BasicBlock *L = BasicBlock::Create(Context, "L", F);
930 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
932 IRBuilder<> Builder(Top);
933 Builder.CreateBr(LPh);
935 Builder.SetInsertPoint(LPh);
936 auto *Load = cast<Instruction>(Builder.CreateLoad(T_int64, Arg, "load"));
937 Builder.CreateBr(L);
939 Builder.SetInsertPoint(L);
940 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
941 auto *Add = cast<Instruction>(
942 Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add"));
943 auto *Cond = cast<Instruction>(
944 Builder.CreateICmp(ICmpInst::ICMP_SLT, Add, Load, "cond"));
945 auto *Br = cast<Instruction>(Builder.CreateCondBr(Cond, L, Post));
946 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
947 Phi->addIncoming(Add, L);
949 Builder.SetInsertPoint(Post);
950 Builder.CreateRetVoid();
952 ScalarEvolution SE = buildSE(*F);
953 auto *Loop = LI->getLoopFor(L);
954 const SCEV *EC = SE.getBackedgeTakenCount(Loop);
955 EXPECT_FALSE(isa<SCEVCouldNotCompute>(EC));
956 EXPECT_FALSE(isa<SCEVConstant>(EC));
958 SE.forgetValue(Load);
959 Br->eraseFromParent();
960 Cond->eraseFromParent();
961 Load->eraseFromParent();
963 Builder.SetInsertPoint(L);
964 auto *NewCond = Builder.CreateICmp(
965 ICmpInst::ICMP_SLT, Add, ConstantInt::get(T_int64, 2000), "new.cond");
966 Builder.CreateCondBr(NewCond, L, Post);
967 const SCEV *NewEC = SE.getBackedgeTakenCount(Loop);
968 EXPECT_FALSE(isa<SCEVCouldNotCompute>(NewEC));
969 EXPECT_TRUE(isa<SCEVConstant>(NewEC));
970 EXPECT_EQ(cast<SCEVConstant>(NewEC)->getAPInt().getLimitedValue(), 1999u);
973 TEST_F(ScalarEvolutionsTest, SCEVAddRecFromPHIwithLargeConstants) {
974 // Reference: https://reviews.llvm.org/D37265
975 // Make sure that SCEV does not blow up when constructing an AddRec
976 // with predicates for a phi with the update pattern:
977 // (SExt/ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy) + InvariantAccum
978 // when either the initial value of the Phi or the InvariantAccum are
979 // constants that are too large to fit in an ix but are zero when truncated to
980 // ix.
981 FunctionType *FTy =
982 FunctionType::get(Type::getVoidTy(Context), std::vector<Type *>(), false);
983 Function *F = cast<Function>(M.getOrInsertFunction("addrecphitest", FTy));
986 Create IR:
987 entry:
988 br label %loop
989 loop:
990 %0 = phi i64 [-9223372036854775808, %entry], [%3, %loop]
991 %1 = shl i64 %0, 32
992 %2 = ashr exact i64 %1, 32
993 %3 = add i64 %2, -9223372036854775808
994 br i1 undef, label %exit, label %loop
995 exit:
996 ret void
998 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
999 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
1000 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
1002 // entry:
1003 BranchInst::Create(LoopBB, EntryBB);
1004 // loop:
1005 auto *MinInt64 =
1006 ConstantInt::get(Context, APInt(64, 0x8000000000000000U, true));
1007 auto *Int64_32 = ConstantInt::get(Context, APInt(64, 32));
1008 auto *Br = BranchInst::Create(
1009 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
1010 auto *Phi = PHINode::Create(Type::getInt64Ty(Context), 2, "", Br);
1011 auto *Shl = BinaryOperator::CreateShl(Phi, Int64_32, "", Br);
1012 auto *AShr = BinaryOperator::CreateExactAShr(Shl, Int64_32, "", Br);
1013 auto *Add = BinaryOperator::CreateAdd(AShr, MinInt64, "", Br);
1014 Phi->addIncoming(MinInt64, EntryBB);
1015 Phi->addIncoming(Add, LoopBB);
1016 // exit:
1017 ReturnInst::Create(Context, nullptr, ExitBB);
1019 // Make sure that SCEV doesn't blow up
1020 ScalarEvolution SE = buildSE(*F);
1021 SCEVUnionPredicate Preds;
1022 const SCEV *Expr = SE.getSCEV(Phi);
1023 EXPECT_NE(nullptr, Expr);
1024 EXPECT_TRUE(isa<SCEVUnknown>(Expr));
1025 auto Result = SE.createAddRecFromPHIWithCasts(cast<SCEVUnknown>(Expr));
1028 TEST_F(ScalarEvolutionsTest, SCEVAddRecFromPHIwithLargeConstantAccum) {
1029 // Make sure that SCEV does not blow up when constructing an AddRec
1030 // with predicates for a phi with the update pattern:
1031 // (SExt/ZExt ix (Trunc iy (%SymbolicPHI) to ix) to iy) + InvariantAccum
1032 // when the InvariantAccum is a constant that is too large to fit in an
1033 // ix but are zero when truncated to ix, and the initial value of the
1034 // phi is not a constant.
1035 Type *Int32Ty = Type::getInt32Ty(Context);
1036 SmallVector<Type *, 1> Types;
1037 Types.push_back(Int32Ty);
1038 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), Types, false);
1039 Function *F = cast<Function>(M.getOrInsertFunction("addrecphitest", FTy));
1042 Create IR:
1043 define @addrecphitest(i32)
1044 entry:
1045 br label %loop
1046 loop:
1047 %1 = phi i32 [%0, %entry], [%4, %loop]
1048 %2 = shl i32 %1, 16
1049 %3 = ashr exact i32 %2, 16
1050 %4 = add i32 %3, -2147483648
1051 br i1 undef, label %exit, label %loop
1052 exit:
1053 ret void
1055 BasicBlock *EntryBB = BasicBlock::Create(Context, "entry", F);
1056 BasicBlock *LoopBB = BasicBlock::Create(Context, "loop", F);
1057 BasicBlock *ExitBB = BasicBlock::Create(Context, "exit", F);
1059 // entry:
1060 BranchInst::Create(LoopBB, EntryBB);
1061 // loop:
1062 auto *MinInt32 = ConstantInt::get(Context, APInt(32, 0x80000000U, true));
1063 auto *Int32_16 = ConstantInt::get(Context, APInt(32, 16));
1064 auto *Br = BranchInst::Create(
1065 LoopBB, ExitBB, UndefValue::get(Type::getInt1Ty(Context)), LoopBB);
1066 auto *Phi = PHINode::Create(Int32Ty, 2, "", Br);
1067 auto *Shl = BinaryOperator::CreateShl(Phi, Int32_16, "", Br);
1068 auto *AShr = BinaryOperator::CreateExactAShr(Shl, Int32_16, "", Br);
1069 auto *Add = BinaryOperator::CreateAdd(AShr, MinInt32, "", Br);
1070 auto *Arg = &*(F->arg_begin());
1071 Phi->addIncoming(Arg, EntryBB);
1072 Phi->addIncoming(Add, LoopBB);
1073 // exit:
1074 ReturnInst::Create(Context, nullptr, ExitBB);
1076 // Make sure that SCEV doesn't blow up
1077 ScalarEvolution SE = buildSE(*F);
1078 SCEVUnionPredicate Preds;
1079 const SCEV *Expr = SE.getSCEV(Phi);
1080 EXPECT_NE(nullptr, Expr);
1081 EXPECT_TRUE(isa<SCEVUnknown>(Expr));
1082 auto Result = SE.createAddRecFromPHIWithCasts(cast<SCEVUnknown>(Expr));
1085 TEST_F(ScalarEvolutionsTest, SCEVFoldSumOfTruncs) {
1086 // Verify that the following SCEV gets folded to a zero:
1087 // (-1 * (trunc i64 (-1 * %0) to i32)) + (-1 * (trunc i64 %0 to i32)
1088 Type *ArgTy = Type::getInt64Ty(Context);
1089 Type *Int32Ty = Type::getInt32Ty(Context);
1090 SmallVector<Type *, 1> Types;
1091 Types.push_back(ArgTy);
1092 FunctionType *FTy = FunctionType::get(Type::getVoidTy(Context), Types, false);
1093 Function *F = cast<Function>(M.getOrInsertFunction("f", FTy));
1094 BasicBlock *BB = BasicBlock::Create(Context, "entry", F);
1095 ReturnInst::Create(Context, nullptr, BB);
1097 ScalarEvolution SE = buildSE(*F);
1099 auto *Arg = &*(F->arg_begin());
1100 const auto *ArgSCEV = SE.getSCEV(Arg);
1102 // Build the SCEV
1103 const auto *A0 = SE.getNegativeSCEV(ArgSCEV);
1104 const auto *A1 = SE.getTruncateExpr(A0, Int32Ty);
1105 const auto *A = SE.getNegativeSCEV(A1);
1107 const auto *B0 = SE.getTruncateExpr(ArgSCEV, Int32Ty);
1108 const auto *B = SE.getNegativeSCEV(B0);
1110 const auto *Expr = SE.getAddExpr(A, B);
1111 // Verify that the SCEV was folded to 0
1112 const auto *ZeroConst = SE.getConstant(Int32Ty, 0);
1113 EXPECT_EQ(Expr, ZeroConst);
1116 // Check that we can correctly identify the points at which the SCEV of the
1117 // AddRec can be expanded.
1118 TEST_F(ScalarEvolutionsTest, SCEVExpanderIsSafeToExpandAt) {
1120 * Create the following code:
1121 * func(i64 addrspace(10)* %arg)
1122 * top:
1123 * br label %L.ph
1124 * L.ph:
1125 * br label %L
1126 * L:
1127 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
1128 * %add = add i64 %phi2, 1
1129 * %cond = icmp slt i64 %add, 1000; then becomes 2000.
1130 * br i1 %cond, label %post, label %L2
1131 * post:
1132 * ret void
1136 // Create a module with non-integral pointers in it's datalayout
1137 Module NIM("nonintegral", Context);
1138 std::string DataLayout = M.getDataLayoutStr();
1139 if (!DataLayout.empty())
1140 DataLayout += "-";
1141 DataLayout += "ni:10";
1142 NIM.setDataLayout(DataLayout);
1144 Type *T_int64 = Type::getInt64Ty(Context);
1145 Type *T_pint64 = T_int64->getPointerTo(10);
1147 FunctionType *FTy =
1148 FunctionType::get(Type::getVoidTy(Context), {T_pint64}, false);
1149 Function *F = cast<Function>(NIM.getOrInsertFunction("foo", FTy));
1151 BasicBlock *Top = BasicBlock::Create(Context, "top", F);
1152 BasicBlock *LPh = BasicBlock::Create(Context, "L.ph", F);
1153 BasicBlock *L = BasicBlock::Create(Context, "L", F);
1154 BasicBlock *Post = BasicBlock::Create(Context, "post", F);
1156 IRBuilder<> Builder(Top);
1157 Builder.CreateBr(LPh);
1159 Builder.SetInsertPoint(LPh);
1160 Builder.CreateBr(L);
1162 Builder.SetInsertPoint(L);
1163 PHINode *Phi = Builder.CreatePHI(T_int64, 2);
1164 auto *Add = cast<Instruction>(
1165 Builder.CreateAdd(Phi, ConstantInt::get(T_int64, 1), "add"));
1166 auto *Limit = ConstantInt::get(T_int64, 1000);
1167 auto *Cond = cast<Instruction>(
1168 Builder.CreateICmp(ICmpInst::ICMP_SLT, Add, Limit, "cond"));
1169 Builder.CreateCondBr(Cond, L, Post);
1170 Phi->addIncoming(ConstantInt::get(T_int64, 0), LPh);
1171 Phi->addIncoming(Add, L);
1173 Builder.SetInsertPoint(Post);
1174 Builder.CreateRetVoid();
1176 ScalarEvolution SE = buildSE(*F);
1177 const SCEV *S = SE.getSCEV(Phi);
1178 EXPECT_TRUE(isa<SCEVAddRecExpr>(S));
1179 const SCEVAddRecExpr *AR = cast<SCEVAddRecExpr>(S);
1180 EXPECT_TRUE(AR->isAffine());
1181 EXPECT_FALSE(isSafeToExpandAt(AR, Top->getTerminator(), SE));
1182 EXPECT_FALSE(isSafeToExpandAt(AR, LPh->getTerminator(), SE));
1183 EXPECT_TRUE(isSafeToExpandAt(AR, L->getTerminator(), SE));
1184 EXPECT_TRUE(isSafeToExpandAt(AR, Post->getTerminator(), SE));
1187 // Check that SCEV expander does not use the nuw instruction
1188 // for expansion.
1189 TEST_F(ScalarEvolutionsTest, SCEVExpanderNUW) {
1191 * Create the following code:
1192 * func(i64 %a)
1193 * entry:
1194 * br false, label %exit, label %body
1195 * body:
1196 * %s1 = add i64 %a, -1
1197 * br label %exit
1198 * exit:
1199 * %s = add nuw i64 %a, -1
1200 * ret %s
1203 // Create a module.
1204 Module M("SCEVExpanderNUW", Context);
1206 Type *T_int64 = Type::getInt64Ty(Context);
1208 FunctionType *FTy =
1209 FunctionType::get(Type::getVoidTy(Context), { T_int64 }, false);
1210 Function *F = cast<Function>(M.getOrInsertFunction("func", FTy));
1211 Argument *Arg = &*F->arg_begin();
1212 ConstantInt *C = ConstantInt::get(Context, APInt(64, -1));
1214 BasicBlock *Entry = BasicBlock::Create(Context, "entry", F);
1215 BasicBlock *Body = BasicBlock::Create(Context, "body", F);
1216 BasicBlock *Exit = BasicBlock::Create(Context, "exit", F);
1218 IRBuilder<> Builder(Entry);
1219 ConstantInt *Cond = ConstantInt::get(Context, APInt(1, 0));
1220 Builder.CreateCondBr(Cond, Exit, Body);
1222 Builder.SetInsertPoint(Body);
1223 auto *S1 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1224 Builder.CreateBr(Exit);
1226 Builder.SetInsertPoint(Exit);
1227 auto *S2 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1228 S2->setHasNoUnsignedWrap(true);
1229 auto *R = cast<Instruction>(Builder.CreateRetVoid());
1231 ScalarEvolution SE = buildSE(*F);
1232 const SCEV *S = SE.getSCEV(S1);
1233 EXPECT_TRUE(isa<SCEVAddExpr>(S));
1234 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
1235 auto *I = cast<Instruction>(Exp.expandCodeFor(S, nullptr, R));
1236 EXPECT_FALSE(I->hasNoUnsignedWrap());
1239 // Check that SCEV expander does not use the nsw instruction
1240 // for expansion.
1241 TEST_F(ScalarEvolutionsTest, SCEVExpanderNSW) {
1243 * Create the following code:
1244 * func(i64 %a)
1245 * entry:
1246 * br false, label %exit, label %body
1247 * body:
1248 * %s1 = add i64 %a, -1
1249 * br label %exit
1250 * exit:
1251 * %s = add nsw i64 %a, -1
1252 * ret %s
1255 // Create a module.
1256 Module M("SCEVExpanderNSW", Context);
1258 Type *T_int64 = Type::getInt64Ty(Context);
1260 FunctionType *FTy =
1261 FunctionType::get(Type::getVoidTy(Context), { T_int64 }, false);
1262 Function *F = cast<Function>(M.getOrInsertFunction("func", FTy));
1263 Argument *Arg = &*F->arg_begin();
1264 ConstantInt *C = ConstantInt::get(Context, APInt(64, -1));
1266 BasicBlock *Entry = BasicBlock::Create(Context, "entry", F);
1267 BasicBlock *Body = BasicBlock::Create(Context, "body", F);
1268 BasicBlock *Exit = BasicBlock::Create(Context, "exit", F);
1270 IRBuilder<> Builder(Entry);
1271 ConstantInt *Cond = ConstantInt::get(Context, APInt(1, 0));
1272 Builder.CreateCondBr(Cond, Exit, Body);
1274 Builder.SetInsertPoint(Body);
1275 auto *S1 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1276 Builder.CreateBr(Exit);
1278 Builder.SetInsertPoint(Exit);
1279 auto *S2 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1280 S2->setHasNoSignedWrap(true);
1281 auto *R = cast<Instruction>(Builder.CreateRetVoid());
1283 ScalarEvolution SE = buildSE(*F);
1284 const SCEV *S = SE.getSCEV(S1);
1285 EXPECT_TRUE(isa<SCEVAddExpr>(S));
1286 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
1287 auto *I = cast<Instruction>(Exp.expandCodeFor(S, nullptr, R));
1288 EXPECT_FALSE(I->hasNoSignedWrap());
1291 // Check that SCEV does not save the SCEV -> V
1292 // mapping of SCEV differ from V in NUW flag.
1293 TEST_F(ScalarEvolutionsTest, SCEVCacheNUW) {
1295 * Create the following code:
1296 * func(i64 %a)
1297 * entry:
1298 * %s1 = add i64 %a, -1
1299 * %s2 = add nuw i64 %a, -1
1300 * br label %exit
1301 * exit:
1302 * ret %s
1305 // Create a module.
1306 Module M("SCEVCacheNUW", Context);
1308 Type *T_int64 = Type::getInt64Ty(Context);
1310 FunctionType *FTy =
1311 FunctionType::get(Type::getVoidTy(Context), { T_int64 }, false);
1312 Function *F = cast<Function>(M.getOrInsertFunction("func", FTy));
1313 Argument *Arg = &*F->arg_begin();
1314 ConstantInt *C = ConstantInt::get(Context, APInt(64, -1));
1316 BasicBlock *Entry = BasicBlock::Create(Context, "entry", F);
1317 BasicBlock *Exit = BasicBlock::Create(Context, "exit", F);
1319 IRBuilder<> Builder(Entry);
1320 auto *S1 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1321 auto *S2 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1322 S2->setHasNoUnsignedWrap(true);
1323 Builder.CreateBr(Exit);
1325 Builder.SetInsertPoint(Exit);
1326 auto *R = cast<Instruction>(Builder.CreateRetVoid());
1328 ScalarEvolution SE = buildSE(*F);
1329 // Get S2 first to move it to cache.
1330 const SCEV *SC2 = SE.getSCEV(S2);
1331 EXPECT_TRUE(isa<SCEVAddExpr>(SC2));
1332 // Now get S1.
1333 const SCEV *SC1 = SE.getSCEV(S1);
1334 EXPECT_TRUE(isa<SCEVAddExpr>(SC1));
1335 // Expand for S1, it should use S1 not S2 in spite S2
1336 // first in the cache.
1337 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
1338 auto *I = cast<Instruction>(Exp.expandCodeFor(SC1, nullptr, R));
1339 EXPECT_FALSE(I->hasNoUnsignedWrap());
1342 // Check that SCEV does not save the SCEV -> V
1343 // mapping of SCEV differ from V in NSW flag.
1344 TEST_F(ScalarEvolutionsTest, SCEVCacheNSW) {
1346 * Create the following code:
1347 * func(i64 %a)
1348 * entry:
1349 * %s1 = add i64 %a, -1
1350 * %s2 = add nsw i64 %a, -1
1351 * br label %exit
1352 * exit:
1353 * ret %s
1356 // Create a module.
1357 Module M("SCEVCacheNUW", Context);
1359 Type *T_int64 = Type::getInt64Ty(Context);
1361 FunctionType *FTy =
1362 FunctionType::get(Type::getVoidTy(Context), { T_int64 }, false);
1363 Function *F = cast<Function>(M.getOrInsertFunction("func", FTy));
1364 Argument *Arg = &*F->arg_begin();
1365 ConstantInt *C = ConstantInt::get(Context, APInt(64, -1));
1367 BasicBlock *Entry = BasicBlock::Create(Context, "entry", F);
1368 BasicBlock *Exit = BasicBlock::Create(Context, "exit", F);
1370 IRBuilder<> Builder(Entry);
1371 auto *S1 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1372 auto *S2 = cast<Instruction>(Builder.CreateAdd(Arg, C, "add"));
1373 S2->setHasNoSignedWrap(true);
1374 Builder.CreateBr(Exit);
1376 Builder.SetInsertPoint(Exit);
1377 auto *R = cast<Instruction>(Builder.CreateRetVoid());
1379 ScalarEvolution SE = buildSE(*F);
1380 // Get S2 first to move it to cache.
1381 const SCEV *SC2 = SE.getSCEV(S2);
1382 EXPECT_TRUE(isa<SCEVAddExpr>(SC2));
1383 // Now get S1.
1384 const SCEV *SC1 = SE.getSCEV(S1);
1385 EXPECT_TRUE(isa<SCEVAddExpr>(SC1));
1386 // Expand for S1, it should use S1 not S2 in spite S2
1387 // first in the cache.
1388 SCEVExpander Exp(SE, M.getDataLayout(), "expander");
1389 auto *I = cast<Instruction>(Exp.expandCodeFor(SC1, nullptr, R));
1390 EXPECT_FALSE(I->hasNoSignedWrap());
1393 } // end anonymous namespace
1394 } // end namespace llvm