1 //===- ScalarEvolutionsTest.cpp - ScalarEvolution unit tests --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
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"
32 // We use this fixture to ensure that we clean up ScalarEvolution before
33 // deleting the PassManager.
34 class ScalarEvolutionsTest
: public testing::Test
{
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
);
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
);
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(),
93 EXPECT_EQ(cast
<SCEVConstant
>(M1
->getOperand(0))->getValue()->getZExtValue(),
95 EXPECT_EQ(cast
<SCEVConstant
>(M2
->getOperand(0))->getValue()->getZExtValue(),
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
);
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
)),
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
136 EXPECT_EQ(S1
, ZeroConst
);
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
);
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(),
173 ConstantInt
*Ci32
= ConstantInt::get(Context
, APInt(32, 1));
174 GetElementPtrInst
*Gep0
=
175 GetElementPtrInst::Create(I32Ty
, Alloca
, Ci32
, "gep0", Br
);
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
);
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");
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
)
210 llvm_unreachable("Expected to find instruction!");
213 TEST_F(ScalarEvolutionsTest
, CommutativeExprOperandOrder
) {
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 { "
228 " %entrycond = icmp sgt i32 %n, 0 "
229 " br i1 %entrycond, label %loop.ph, label %for.end "
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 "
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 "
249 " br label %for.end "
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 "
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"
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)"
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"})
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
) {
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
);
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
)),
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();
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
);
433 TEST_F(ScalarEvolutionsTest
, SCEVAddExpr
) {
434 Type
*Ty32
= Type::getInt32Ty(Context
);
435 Type
*ArgTys
[] = {Type::getInt64Ty(Context
), Ty32
};
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
454 for (int i
= 0; i
< 10; i
++) {
455 Mul1
= BinaryOperator::CreateMul(Add2
, Add1
, "", EntryBB
);
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
)
469 llvm_unreachable("Could not find instructions!");
472 TEST_F(ScalarEvolutionsTest
, SCEVNormalization
) {
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 { "
487 " br label %loop.ph "
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 "
503 "define void @f_2(i32 %a, i32 %b, i32 %c, i32 %d) "
504 " local_unnamed_addr { "
509 " br i1 undef, label %loop_0, label %loop_1 "
512 " br i1 undef, label %loop_2, label %loop_1 "
516 " br i1 undef, label %end, label %loop_2 "
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
));
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
578 GetAddRec(L1
, {Exprs
[1], Exprs
[2], Exprs
[3], Exprs
[0]})); // 4
580 GetAddRec(L1
, {Exprs
[1], Exprs
[2], Exprs
[0], Exprs
[3]})); // 5
582 GetAddRec(L1
, {Exprs
[1], Exprs
[3], Exprs
[3], Exprs
[1]})); // 6
584 Exprs
.push_back(GetAdd({Exprs
[6], Exprs
[3], V2
})); // 7
587 GetAddRec(L2
, {Exprs
[4], Exprs
[3], Exprs
[3], Exprs
[5]})); // 8
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();
597 LoopSets
.back().insert(L0
);
599 LoopSets
.back().insert(L1
);
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
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
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
) {
631 // Generate a function like below:
632 // define void @foo() {
634 // br label %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
642 // %dec = add nsw i64 %0, -1
643 // br label %for.cond
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
651 // %dec5 = add nsw i64 %1, -1
652 // br label %for.cond1
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
662 // %dec94 = add nsw i64 %19, -1
663 // br label %for.cond89
666 // %gep = getelementptr i8, i8* null, i64 %dec
667 // %gep6 = getelementptr i8, i8* %gep, i64 %dec5
669 // %gep95 = getelementptr i8, i8* %gep91, i64 %dec94
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
);
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",
695 NextBB
= BasicBlock::Create(Context
, "for.cond", F
, 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
);
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)
726 * %phi = phi i64 [i64 0, %L.ph], [ %add, %L2 ]
727 * %add = add i64 %phi2, 1
728 * br i1 undef, label %post, label %L2
730 * %gepbase = getelementptr i64 addrspace(10)* %arg, i64 1
731 * #= %gep = getelementptr i64 addrspace(10)* %gepbase, i64 %add =#
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())
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);
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
);
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
);
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)
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
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())
817 DataLayout
+= "ni:10";
818 NIM
.setDataLayout(DataLayout
);
820 Type
*T_int64
= Type::getInt64Ty(Context
);
821 Type
*T_pint64
= T_int64
->getPointerTo(10);
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
);
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));
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(),
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(),
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)
898 * %load = load i64 addrspace(10)* %arg
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
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())
915 DataLayout
+= "ni:10";
916 NIM
.setDataLayout(DataLayout
);
918 Type
*T_int64
= Type::getInt64Ty(Context
);
919 Type
*T_pint64
= T_int64
->getPointerTo(10);
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"));
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
982 FunctionType::get(Type::getVoidTy(Context
), std::vector
<Type
*>(), false);
983 Function
*F
= cast
<Function
>(M
.getOrInsertFunction("addrecphitest", FTy
));
990 %0 = phi i64 [-9223372036854775808, %entry], [%3, %loop]
992 %2 = ashr exact i64 %1, 32
993 %3 = add i64 %2, -9223372036854775808
994 br i1 undef, label %exit, label %loop
998 BasicBlock
*EntryBB
= BasicBlock::Create(Context
, "entry", F
);
999 BasicBlock
*LoopBB
= BasicBlock::Create(Context
, "loop", F
);
1000 BasicBlock
*ExitBB
= BasicBlock::Create(Context
, "exit", F
);
1003 BranchInst::Create(LoopBB
, EntryBB
);
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
);
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
));
1043 define @addrecphitest(i32)
1047 %1 = phi i32 [%0, %entry], [%4, %loop]
1049 %3 = ashr exact i32 %2, 16
1050 %4 = add i32 %3, -2147483648
1051 br i1 undef, label %exit, label %loop
1055 BasicBlock
*EntryBB
= BasicBlock::Create(Context
, "entry", F
);
1056 BasicBlock
*LoopBB
= BasicBlock::Create(Context
, "loop", F
);
1057 BasicBlock
*ExitBB
= BasicBlock::Create(Context
, "exit", F
);
1060 BranchInst::Create(LoopBB
, EntryBB
);
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
);
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
);
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)
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
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())
1141 DataLayout
+= "ni:10";
1142 NIM
.setDataLayout(DataLayout
);
1144 Type
*T_int64
= Type::getInt64Ty(Context
);
1145 Type
*T_pint64
= T_int64
->getPointerTo(10);
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
1189 TEST_F(ScalarEvolutionsTest
, SCEVExpanderNUW
) {
1191 * Create the following code:
1194 * br false, label %exit, label %body
1196 * %s1 = add i64 %a, -1
1199 * %s = add nuw i64 %a, -1
1204 Module
M("SCEVExpanderNUW", Context
);
1206 Type
*T_int64
= Type::getInt64Ty(Context
);
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
1241 TEST_F(ScalarEvolutionsTest
, SCEVExpanderNSW
) {
1243 * Create the following code:
1246 * br false, label %exit, label %body
1248 * %s1 = add i64 %a, -1
1251 * %s = add nsw i64 %a, -1
1256 Module
M("SCEVExpanderNSW", Context
);
1258 Type
*T_int64
= Type::getInt64Ty(Context
);
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:
1298 * %s1 = add i64 %a, -1
1299 * %s2 = add nuw i64 %a, -1
1306 Module
M("SCEVCacheNUW", Context
);
1308 Type
*T_int64
= Type::getInt64Ty(Context
);
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
));
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:
1349 * %s1 = add i64 %a, -1
1350 * %s2 = add nsw i64 %a, -1
1357 Module
M("SCEVCacheNUW", Context
);
1359 Type
*T_int64
= Type::getInt64Ty(Context
);
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
));
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