1 //===- llvm/unittest/IR/InstructionsTest.cpp - Instructions unit tests ----===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/AsmParser/Parser.h"
10 #include "llvm/IR/Instructions.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/Analysis/ValueTracking.h"
13 #include "llvm/IR/BasicBlock.h"
14 #include "llvm/IR/Constants.h"
15 #include "llvm/IR/DataLayout.h"
16 #include "llvm/IR/DerivedTypes.h"
17 #include "llvm/IR/Function.h"
18 #include "llvm/IR/IRBuilder.h"
19 #include "llvm/IR/LLVMContext.h"
20 #include "llvm/IR/MDBuilder.h"
21 #include "llvm/IR/Module.h"
22 #include "llvm/IR/NoFolder.h"
23 #include "llvm/IR/Operator.h"
24 #include "llvm/Support/SourceMgr.h"
25 #include "gmock/gmock-matchers.h"
26 #include "gtest/gtest.h"
32 static std::unique_ptr
<Module
> parseIR(LLVMContext
&C
, const char *IR
) {
34 std::unique_ptr
<Module
> Mod
= parseAssemblyString(IR
, Err
, C
);
36 Err
.print("InstructionsTests", errs());
40 TEST(InstructionsTest
, ReturnInst
) {
44 const ReturnInst
* r0
= ReturnInst::Create(C
);
45 EXPECT_EQ(r0
->getNumOperands(), 0U);
46 EXPECT_EQ(r0
->op_begin(), r0
->op_end());
48 IntegerType
* Int1
= IntegerType::get(C
, 1);
49 Constant
* One
= ConstantInt::get(Int1
, 1, true);
50 const ReturnInst
* r1
= ReturnInst::Create(C
, One
);
51 EXPECT_EQ(1U, r1
->getNumOperands());
52 User::const_op_iterator
b(r1
->op_begin());
53 EXPECT_NE(r1
->op_end(), b
);
55 EXPECT_EQ(One
, r1
->getOperand(0));
57 EXPECT_EQ(r1
->op_end(), b
);
64 // Test fixture that provides a module and a single function within it. Useful
65 // for tests that need to refer to the function in some way.
66 class ModuleWithFunctionTest
: public testing::Test
{
68 ModuleWithFunctionTest() : M(new Module("MyModule", Ctx
)) {
69 FArgTypes
.push_back(Type::getInt8Ty(Ctx
));
70 FArgTypes
.push_back(Type::getInt32Ty(Ctx
));
71 FArgTypes
.push_back(Type::getInt64Ty(Ctx
));
73 FunctionType::get(Type::getVoidTy(Ctx
), FArgTypes
, false);
74 F
= Function::Create(FTy
, Function::ExternalLinkage
, "", M
.get());
78 std::unique_ptr
<Module
> M
;
79 SmallVector
<Type
*, 3> FArgTypes
;
83 TEST_F(ModuleWithFunctionTest
, CallInst
) {
84 Value
*Args
[] = {ConstantInt::get(Type::getInt8Ty(Ctx
), 20),
85 ConstantInt::get(Type::getInt32Ty(Ctx
), 9999),
86 ConstantInt::get(Type::getInt64Ty(Ctx
), 42)};
87 std::unique_ptr
<CallInst
> Call(CallInst::Create(F
, Args
));
89 // Make sure iteration over a call's arguments works as expected.
91 for (Value
*Arg
: Call
->arg_operands()) {
92 EXPECT_EQ(FArgTypes
[Idx
], Arg
->getType());
93 EXPECT_EQ(Call
->getArgOperand(Idx
)->getType(), Arg
->getType());
98 TEST_F(ModuleWithFunctionTest
, InvokeInst
) {
99 BasicBlock
*BB1
= BasicBlock::Create(Ctx
, "", F
);
100 BasicBlock
*BB2
= BasicBlock::Create(Ctx
, "", F
);
102 Value
*Args
[] = {ConstantInt::get(Type::getInt8Ty(Ctx
), 20),
103 ConstantInt::get(Type::getInt32Ty(Ctx
), 9999),
104 ConstantInt::get(Type::getInt64Ty(Ctx
), 42)};
105 std::unique_ptr
<InvokeInst
> Invoke(InvokeInst::Create(F
, BB1
, BB2
, Args
));
107 // Make sure iteration over invoke's arguments works as expected.
109 for (Value
*Arg
: Invoke
->arg_operands()) {
110 EXPECT_EQ(FArgTypes
[Idx
], Arg
->getType());
111 EXPECT_EQ(Invoke
->getArgOperand(Idx
)->getType(), Arg
->getType());
116 TEST(InstructionsTest
, BranchInst
) {
119 // Make a BasicBlocks
120 BasicBlock
* bb0
= BasicBlock::Create(C
);
121 BasicBlock
* bb1
= BasicBlock::Create(C
);
123 // Mandatory BranchInst
124 const BranchInst
* b0
= BranchInst::Create(bb0
);
126 EXPECT_TRUE(b0
->isUnconditional());
127 EXPECT_FALSE(b0
->isConditional());
128 EXPECT_EQ(1U, b0
->getNumSuccessors());
130 // check num operands
131 EXPECT_EQ(1U, b0
->getNumOperands());
133 EXPECT_NE(b0
->op_begin(), b0
->op_end());
134 EXPECT_EQ(b0
->op_end(), std::next(b0
->op_begin()));
136 EXPECT_EQ(b0
->op_end(), std::next(b0
->op_begin()));
138 IntegerType
* Int1
= IntegerType::get(C
, 1);
139 Constant
* One
= ConstantInt::get(Int1
, 1, true);
141 // Conditional BranchInst
142 BranchInst
* b1
= BranchInst::Create(bb0
, bb1
, One
);
144 EXPECT_FALSE(b1
->isUnconditional());
145 EXPECT_TRUE(b1
->isConditional());
146 EXPECT_EQ(2U, b1
->getNumSuccessors());
148 // check num operands
149 EXPECT_EQ(3U, b1
->getNumOperands());
151 User::const_op_iterator
b(b1
->op_begin());
154 EXPECT_NE(b
, b1
->op_end());
156 EXPECT_EQ(One
, b1
->getOperand(0));
157 EXPECT_EQ(One
, b1
->getCondition());
162 EXPECT_EQ(bb1
, b1
->getOperand(1));
163 EXPECT_EQ(bb1
, b1
->getSuccessor(1));
168 EXPECT_EQ(bb0
, b1
->getOperand(2));
169 EXPECT_EQ(bb0
, b1
->getSuccessor(0));
172 EXPECT_EQ(b1
->op_end(), b
);
182 TEST(InstructionsTest
, CastInst
) {
185 Type
*Int8Ty
= Type::getInt8Ty(C
);
186 Type
*Int16Ty
= Type::getInt16Ty(C
);
187 Type
*Int32Ty
= Type::getInt32Ty(C
);
188 Type
*Int64Ty
= Type::getInt64Ty(C
);
189 Type
*V8x8Ty
= VectorType::get(Int8Ty
, 8);
190 Type
*V8x64Ty
= VectorType::get(Int64Ty
, 8);
191 Type
*X86MMXTy
= Type::getX86_MMXTy(C
);
193 Type
*HalfTy
= Type::getHalfTy(C
);
194 Type
*FloatTy
= Type::getFloatTy(C
);
195 Type
*DoubleTy
= Type::getDoubleTy(C
);
197 Type
*V2Int32Ty
= VectorType::get(Int32Ty
, 2);
198 Type
*V2Int64Ty
= VectorType::get(Int64Ty
, 2);
199 Type
*V4Int16Ty
= VectorType::get(Int16Ty
, 4);
201 Type
*Int32PtrTy
= PointerType::get(Int32Ty
, 0);
202 Type
*Int64PtrTy
= PointerType::get(Int64Ty
, 0);
204 Type
*Int32PtrAS1Ty
= PointerType::get(Int32Ty
, 1);
205 Type
*Int64PtrAS1Ty
= PointerType::get(Int64Ty
, 1);
207 Type
*V2Int32PtrAS1Ty
= VectorType::get(Int32PtrAS1Ty
, 2);
208 Type
*V2Int64PtrAS1Ty
= VectorType::get(Int64PtrAS1Ty
, 2);
209 Type
*V4Int32PtrAS1Ty
= VectorType::get(Int32PtrAS1Ty
, 4);
210 Type
*V4Int64PtrAS1Ty
= VectorType::get(Int64PtrAS1Ty
, 4);
212 Type
*V2Int64PtrTy
= VectorType::get(Int64PtrTy
, 2);
213 Type
*V2Int32PtrTy
= VectorType::get(Int32PtrTy
, 2);
214 Type
*V4Int32PtrTy
= VectorType::get(Int32PtrTy
, 4);
216 const Constant
* c8
= Constant::getNullValue(V8x8Ty
);
217 const Constant
* c64
= Constant::getNullValue(V8x64Ty
);
219 const Constant
*v2ptr32
= Constant::getNullValue(V2Int32PtrTy
);
221 EXPECT_TRUE(CastInst::isCastable(V8x8Ty
, X86MMXTy
));
222 EXPECT_TRUE(CastInst::isCastable(X86MMXTy
, V8x8Ty
));
223 EXPECT_FALSE(CastInst::isCastable(Int64Ty
, X86MMXTy
));
224 EXPECT_TRUE(CastInst::isCastable(V8x64Ty
, V8x8Ty
));
225 EXPECT_TRUE(CastInst::isCastable(V8x8Ty
, V8x64Ty
));
226 EXPECT_EQ(CastInst::Trunc
, CastInst::getCastOpcode(c64
, true, V8x8Ty
, true));
227 EXPECT_EQ(CastInst::SExt
, CastInst::getCastOpcode(c8
, true, V8x64Ty
, true));
229 EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty
, X86MMXTy
));
230 EXPECT_FALSE(CastInst::isBitCastable(X86MMXTy
, V8x8Ty
));
231 EXPECT_FALSE(CastInst::isBitCastable(Int64Ty
, X86MMXTy
));
232 EXPECT_FALSE(CastInst::isBitCastable(V8x64Ty
, V8x8Ty
));
233 EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty
, V8x64Ty
));
235 // Check address space casts are rejected since we don't know the sizes here
236 EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy
, Int32PtrAS1Ty
));
237 EXPECT_FALSE(CastInst::isBitCastable(Int32PtrAS1Ty
, Int32PtrTy
));
238 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy
, V2Int32PtrAS1Ty
));
239 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty
, V2Int32PtrTy
));
240 EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrAS1Ty
, V2Int64PtrAS1Ty
));
241 EXPECT_TRUE(CastInst::isCastable(V2Int32PtrAS1Ty
, V2Int32PtrTy
));
242 EXPECT_EQ(CastInst::AddrSpaceCast
, CastInst::getCastOpcode(v2ptr32
, true,
246 // Test mismatched number of elements for pointers
247 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty
, V4Int64PtrAS1Ty
));
248 EXPECT_FALSE(CastInst::isBitCastable(V4Int64PtrAS1Ty
, V2Int32PtrAS1Ty
));
249 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty
, V4Int32PtrAS1Ty
));
250 EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy
, V2Int32PtrTy
));
251 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy
, Int32PtrTy
));
253 EXPECT_TRUE(CastInst::isBitCastable(Int32PtrTy
, Int64PtrTy
));
254 EXPECT_FALSE(CastInst::isBitCastable(DoubleTy
, FloatTy
));
255 EXPECT_FALSE(CastInst::isBitCastable(FloatTy
, DoubleTy
));
256 EXPECT_TRUE(CastInst::isBitCastable(FloatTy
, FloatTy
));
257 EXPECT_TRUE(CastInst::isBitCastable(FloatTy
, FloatTy
));
258 EXPECT_TRUE(CastInst::isBitCastable(FloatTy
, Int32Ty
));
259 EXPECT_TRUE(CastInst::isBitCastable(Int16Ty
, HalfTy
));
260 EXPECT_TRUE(CastInst::isBitCastable(Int32Ty
, FloatTy
));
261 EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty
, Int64Ty
));
263 EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty
, V4Int16Ty
));
264 EXPECT_FALSE(CastInst::isBitCastable(Int32Ty
, Int64Ty
));
265 EXPECT_FALSE(CastInst::isBitCastable(Int64Ty
, Int32Ty
));
267 EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy
, Int64Ty
));
268 EXPECT_FALSE(CastInst::isBitCastable(Int64Ty
, V2Int32PtrTy
));
269 EXPECT_TRUE(CastInst::isBitCastable(V2Int64PtrTy
, V2Int32PtrTy
));
270 EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrTy
, V2Int64PtrTy
));
271 EXPECT_FALSE(CastInst::isBitCastable(V2Int32Ty
, V2Int64Ty
));
272 EXPECT_FALSE(CastInst::isBitCastable(V2Int64Ty
, V2Int32Ty
));
275 EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast
,
276 Constant::getNullValue(V4Int32PtrTy
),
278 EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast
,
279 Constant::getNullValue(V2Int32PtrTy
),
282 EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast
,
283 Constant::getNullValue(V4Int32PtrAS1Ty
),
285 EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast
,
286 Constant::getNullValue(V2Int32PtrTy
),
290 // Check that assertion is not hit when creating a cast with a vector of
293 BasicBlock
*BB
= BasicBlock::Create(C
);
294 Constant
*NullV2I32Ptr
= Constant::getNullValue(V2Int32PtrTy
);
295 auto Inst1
= CastInst::CreatePointerCast(NullV2I32Ptr
, V2Int32Ty
, "foo", BB
);
298 auto Inst2
= CastInst::CreatePointerCast(NullV2I32Ptr
, V2Int32Ty
);
301 Inst1
->eraseFromParent();
305 TEST(InstructionsTest
, VectorGep
) {
309 Type
*I8Ty
= IntegerType::get(C
, 8);
310 Type
*I32Ty
= IntegerType::get(C
, 32);
311 PointerType
*Ptri8Ty
= PointerType::get(I8Ty
, 0);
312 PointerType
*Ptri32Ty
= PointerType::get(I32Ty
, 0);
314 VectorType
*V2xi8PTy
= VectorType::get(Ptri8Ty
, 2);
315 VectorType
*V2xi32PTy
= VectorType::get(Ptri32Ty
, 2);
317 // Test different aspects of the vector-of-pointers type
318 // and GEPs which use this type.
319 ConstantInt
*Ci32a
= ConstantInt::get(C
, APInt(32, 1492));
320 ConstantInt
*Ci32b
= ConstantInt::get(C
, APInt(32, 1948));
321 std::vector
<Constant
*> ConstVa(2, Ci32a
);
322 std::vector
<Constant
*> ConstVb(2, Ci32b
);
323 Constant
*C2xi32a
= ConstantVector::get(ConstVa
);
324 Constant
*C2xi32b
= ConstantVector::get(ConstVb
);
326 CastInst
*PtrVecA
= new IntToPtrInst(C2xi32a
, V2xi32PTy
);
327 CastInst
*PtrVecB
= new IntToPtrInst(C2xi32b
, V2xi32PTy
);
329 ICmpInst
*ICmp0
= new ICmpInst(ICmpInst::ICMP_SGT
, PtrVecA
, PtrVecB
);
330 ICmpInst
*ICmp1
= new ICmpInst(ICmpInst::ICMP_ULT
, PtrVecA
, PtrVecB
);
331 EXPECT_NE(ICmp0
, ICmp1
); // suppress warning.
333 BasicBlock
* BB0
= BasicBlock::Create(C
);
334 // Test InsertAtEnd ICmpInst constructor.
335 ICmpInst
*ICmp2
= new ICmpInst(*BB0
, ICmpInst::ICMP_SGE
, PtrVecA
, PtrVecB
);
336 EXPECT_NE(ICmp0
, ICmp2
); // suppress warning.
338 GetElementPtrInst
*Gep0
= GetElementPtrInst::Create(I32Ty
, PtrVecA
, C2xi32a
);
339 GetElementPtrInst
*Gep1
= GetElementPtrInst::Create(I32Ty
, PtrVecA
, C2xi32b
);
340 GetElementPtrInst
*Gep2
= GetElementPtrInst::Create(I32Ty
, PtrVecB
, C2xi32a
);
341 GetElementPtrInst
*Gep3
= GetElementPtrInst::Create(I32Ty
, PtrVecB
, C2xi32b
);
343 CastInst
*BTC0
= new BitCastInst(Gep0
, V2xi8PTy
);
344 CastInst
*BTC1
= new BitCastInst(Gep1
, V2xi8PTy
);
345 CastInst
*BTC2
= new BitCastInst(Gep2
, V2xi8PTy
);
346 CastInst
*BTC3
= new BitCastInst(Gep3
, V2xi8PTy
);
348 Value
*S0
= BTC0
->stripPointerCasts();
349 Value
*S1
= BTC1
->stripPointerCasts();
350 Value
*S2
= BTC2
->stripPointerCasts();
351 Value
*S3
= BTC3
->stripPointerCasts();
359 DataLayout
TD("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3"
360 "2:32:32-f64:64:64-v64:64:64-v128:128:128-a:0:64-s:64:64-f80"
361 ":128:128-n8:16:32:64-S128");
362 // Make sure we don't crash
363 GetPointerBaseWithConstantOffset(Gep0
, Offset
, TD
);
364 GetPointerBaseWithConstantOffset(Gep1
, Offset
, TD
);
365 GetPointerBaseWithConstantOffset(Gep2
, Offset
, TD
);
366 GetPointerBaseWithConstantOffset(Gep3
, Offset
, TD
);
369 GetElementPtrInst
*GepII0
= GetElementPtrInst::Create(I32Ty
, Gep0
, C2xi32b
);
370 GetElementPtrInst
*GepII1
= GetElementPtrInst::Create(I32Ty
, Gep1
, C2xi32a
);
371 GetElementPtrInst
*GepII2
= GetElementPtrInst::Create(I32Ty
, Gep2
, C2xi32b
);
372 GetElementPtrInst
*GepII3
= GetElementPtrInst::Create(I32Ty
, Gep3
, C2xi32a
);
374 EXPECT_EQ(GepII0
->getNumIndices(), 1u);
375 EXPECT_EQ(GepII1
->getNumIndices(), 1u);
376 EXPECT_EQ(GepII2
->getNumIndices(), 1u);
377 EXPECT_EQ(GepII3
->getNumIndices(), 1u);
379 EXPECT_FALSE(GepII0
->hasAllZeroIndices());
380 EXPECT_FALSE(GepII1
->hasAllZeroIndices());
381 EXPECT_FALSE(GepII2
->hasAllZeroIndices());
382 EXPECT_FALSE(GepII3
->hasAllZeroIndices());
399 ICmp2
->eraseFromParent();
408 TEST(InstructionsTest
, FPMathOperator
) {
410 IRBuilder
<> Builder(Context
);
411 MDBuilder
MDHelper(Context
);
412 Instruction
*I
= Builder
.CreatePHI(Builder
.getDoubleTy(), 0);
413 MDNode
*MD1
= MDHelper
.createFPMath(1.0);
414 Value
*V1
= Builder
.CreateFAdd(I
, I
, "", MD1
);
415 EXPECT_TRUE(isa
<FPMathOperator
>(V1
));
416 FPMathOperator
*O1
= cast
<FPMathOperator
>(V1
);
417 EXPECT_EQ(O1
->getFPAccuracy(), 1.0);
423 TEST(InstructionsTest
, isEliminableCastPair
) {
426 Type
* Int16Ty
= Type::getInt16Ty(C
);
427 Type
* Int32Ty
= Type::getInt32Ty(C
);
428 Type
* Int64Ty
= Type::getInt64Ty(C
);
429 Type
* Int64PtrTy
= Type::getInt64PtrTy(C
);
431 // Source and destination pointers have same size -> bitcast.
432 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt
,
434 Int64PtrTy
, Int64Ty
, Int64PtrTy
,
435 Int32Ty
, nullptr, Int32Ty
),
438 // Source and destination have unknown sizes, but the same address space and
439 // the intermediate int is the maximum pointer size -> bitcast
440 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt
,
442 Int64PtrTy
, Int64Ty
, Int64PtrTy
,
443 nullptr, nullptr, nullptr),
446 // Source and destination have unknown sizes, but the same address space and
447 // the intermediate int is not the maximum pointer size -> nothing
448 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt
,
450 Int64PtrTy
, Int32Ty
, Int64PtrTy
,
451 nullptr, nullptr, nullptr),
454 // Middle pointer big enough -> bitcast.
455 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr
,
457 Int64Ty
, Int64PtrTy
, Int64Ty
,
458 nullptr, Int64Ty
, nullptr),
461 // Middle pointer too small -> fail.
462 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr
,
464 Int64Ty
, Int64PtrTy
, Int64Ty
,
465 nullptr, Int32Ty
, nullptr),
468 // Test that we don't eliminate bitcasts between different address spaces,
469 // or if we don't have available pointer size information.
470 DataLayout
DL("e-p:32:32:32-p1:16:16:16-p2:64:64:64-i1:8:8-i8:8:8-i16:16:16"
471 "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64"
472 "-v128:128:128-a:0:64-s:64:64-f80:128:128-n8:16:32:64-S128");
474 Type
* Int64PtrTyAS1
= Type::getInt64PtrTy(C
, 1);
475 Type
* Int64PtrTyAS2
= Type::getInt64PtrTy(C
, 2);
477 IntegerType
*Int16SizePtr
= DL
.getIntPtrType(C
, 1);
478 IntegerType
*Int64SizePtr
= DL
.getIntPtrType(C
, 2);
480 // Cannot simplify inttoptr, addrspacecast
481 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr
,
482 CastInst::AddrSpaceCast
,
483 Int16Ty
, Int64PtrTyAS1
, Int64PtrTyAS2
,
484 nullptr, Int16SizePtr
, Int64SizePtr
),
487 // Cannot simplify addrspacecast, ptrtoint
488 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::AddrSpaceCast
,
490 Int64PtrTyAS1
, Int64PtrTyAS2
, Int16Ty
,
491 Int64SizePtr
, Int16SizePtr
, nullptr),
494 // Pass since the bitcast address spaces are the same
495 EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr
,
497 Int16Ty
, Int64PtrTyAS1
, Int64PtrTyAS1
,
498 nullptr, nullptr, nullptr),
503 TEST(InstructionsTest
, CloneCall
) {
505 Type
*Int32Ty
= Type::getInt32Ty(C
);
506 Type
*ArgTys
[] = {Int32Ty
, Int32Ty
, Int32Ty
};
507 FunctionType
*FnTy
= FunctionType::get(Int32Ty
, ArgTys
, /*isVarArg=*/false);
508 Value
*Callee
= Constant::getNullValue(FnTy
->getPointerTo());
510 ConstantInt::get(Int32Ty
, 1),
511 ConstantInt::get(Int32Ty
, 2),
512 ConstantInt::get(Int32Ty
, 3)
514 std::unique_ptr
<CallInst
> Call(
515 CallInst::Create(FnTy
, Callee
, Args
, "result"));
517 // Test cloning the tail call kind.
518 CallInst::TailCallKind Kinds
[] = {CallInst::TCK_None
, CallInst::TCK_Tail
,
519 CallInst::TCK_MustTail
};
520 for (CallInst::TailCallKind TCK
: Kinds
) {
521 Call
->setTailCallKind(TCK
);
522 std::unique_ptr
<CallInst
> Clone(cast
<CallInst
>(Call
->clone()));
523 EXPECT_EQ(Call
->getTailCallKind(), Clone
->getTailCallKind());
525 Call
->setTailCallKind(CallInst::TCK_None
);
527 // Test cloning an attribute.
530 AB
.addAttribute(Attribute::ReadOnly
);
532 AttributeList::get(C
, AttributeList::FunctionIndex
, AB
));
533 std::unique_ptr
<CallInst
> Clone(cast
<CallInst
>(Call
->clone()));
534 EXPECT_TRUE(Clone
->onlyReadsMemory());
538 TEST(InstructionsTest
, AlterCallBundles
) {
540 Type
*Int32Ty
= Type::getInt32Ty(C
);
541 FunctionType
*FnTy
= FunctionType::get(Int32Ty
, Int32Ty
, /*isVarArg=*/false);
542 Value
*Callee
= Constant::getNullValue(FnTy
->getPointerTo());
543 Value
*Args
[] = {ConstantInt::get(Int32Ty
, 42)};
544 OperandBundleDef
OldBundle("before", UndefValue::get(Int32Ty
));
545 std::unique_ptr
<CallInst
> Call(
546 CallInst::Create(FnTy
, Callee
, Args
, OldBundle
, "result"));
547 Call
->setTailCallKind(CallInst::TailCallKind::TCK_NoTail
);
549 AB
.addAttribute(Attribute::Cold
);
550 Call
->setAttributes(AttributeList::get(C
, AttributeList::FunctionIndex
, AB
));
551 Call
->setDebugLoc(DebugLoc(MDNode::get(C
, None
)));
553 OperandBundleDef
NewBundle("after", ConstantInt::get(Int32Ty
, 7));
554 std::unique_ptr
<CallInst
> Clone(CallInst::Create(Call
.get(), NewBundle
));
555 EXPECT_EQ(Call
->getNumArgOperands(), Clone
->getNumArgOperands());
556 EXPECT_EQ(Call
->getArgOperand(0), Clone
->getArgOperand(0));
557 EXPECT_EQ(Call
->getCallingConv(), Clone
->getCallingConv());
558 EXPECT_EQ(Call
->getTailCallKind(), Clone
->getTailCallKind());
559 EXPECT_TRUE(Clone
->hasFnAttr(Attribute::AttrKind::Cold
));
560 EXPECT_EQ(Call
->getDebugLoc(), Clone
->getDebugLoc());
561 EXPECT_EQ(Clone
->getNumOperandBundles(), 1U);
562 EXPECT_TRUE(Clone
->getOperandBundle("after").hasValue());
565 TEST(InstructionsTest
, AlterInvokeBundles
) {
567 Type
*Int32Ty
= Type::getInt32Ty(C
);
568 FunctionType
*FnTy
= FunctionType::get(Int32Ty
, Int32Ty
, /*isVarArg=*/false);
569 Value
*Callee
= Constant::getNullValue(FnTy
->getPointerTo());
570 Value
*Args
[] = {ConstantInt::get(Int32Ty
, 42)};
571 std::unique_ptr
<BasicBlock
> NormalDest(BasicBlock::Create(C
));
572 std::unique_ptr
<BasicBlock
> UnwindDest(BasicBlock::Create(C
));
573 OperandBundleDef
OldBundle("before", UndefValue::get(Int32Ty
));
574 std::unique_ptr
<InvokeInst
> Invoke(
575 InvokeInst::Create(FnTy
, Callee
, NormalDest
.get(), UnwindDest
.get(), Args
,
576 OldBundle
, "result"));
578 AB
.addAttribute(Attribute::Cold
);
579 Invoke
->setAttributes(
580 AttributeList::get(C
, AttributeList::FunctionIndex
, AB
));
581 Invoke
->setDebugLoc(DebugLoc(MDNode::get(C
, None
)));
583 OperandBundleDef
NewBundle("after", ConstantInt::get(Int32Ty
, 7));
584 std::unique_ptr
<InvokeInst
> Clone(
585 InvokeInst::Create(Invoke
.get(), NewBundle
));
586 EXPECT_EQ(Invoke
->getNormalDest(), Clone
->getNormalDest());
587 EXPECT_EQ(Invoke
->getUnwindDest(), Clone
->getUnwindDest());
588 EXPECT_EQ(Invoke
->getNumArgOperands(), Clone
->getNumArgOperands());
589 EXPECT_EQ(Invoke
->getArgOperand(0), Clone
->getArgOperand(0));
590 EXPECT_EQ(Invoke
->getCallingConv(), Clone
->getCallingConv());
591 EXPECT_TRUE(Clone
->hasFnAttr(Attribute::AttrKind::Cold
));
592 EXPECT_EQ(Invoke
->getDebugLoc(), Clone
->getDebugLoc());
593 EXPECT_EQ(Clone
->getNumOperandBundles(), 1U);
594 EXPECT_TRUE(Clone
->getOperandBundle("after").hasValue());
597 TEST_F(ModuleWithFunctionTest
, DropPoisonGeneratingFlags
) {
598 auto *OnlyBB
= BasicBlock::Create(Ctx
, "bb", F
);
599 auto *Arg0
= &*F
->arg_begin();
601 IRBuilder
<NoFolder
> B(Ctx
);
602 B
.SetInsertPoint(OnlyBB
);
606 cast
<Instruction
>(B
.CreateUDiv(Arg0
, Arg0
, "", /*isExact*/ true));
607 ASSERT_TRUE(UI
->isExact());
608 UI
->dropPoisonGeneratingFlags();
609 ASSERT_FALSE(UI
->isExact());
614 cast
<Instruction
>(B
.CreateLShr(Arg0
, Arg0
, "", /*isExact*/ true));
615 ASSERT_TRUE(ShrI
->isExact());
616 ShrI
->dropPoisonGeneratingFlags();
617 ASSERT_FALSE(ShrI
->isExact());
621 auto *AI
= cast
<Instruction
>(
622 B
.CreateAdd(Arg0
, Arg0
, "", /*HasNUW*/ true, /*HasNSW*/ false));
623 ASSERT_TRUE(AI
->hasNoUnsignedWrap());
624 AI
->dropPoisonGeneratingFlags();
625 ASSERT_FALSE(AI
->hasNoUnsignedWrap());
626 ASSERT_FALSE(AI
->hasNoSignedWrap());
630 auto *SI
= cast
<Instruction
>(
631 B
.CreateAdd(Arg0
, Arg0
, "", /*HasNUW*/ false, /*HasNSW*/ true));
632 ASSERT_TRUE(SI
->hasNoSignedWrap());
633 SI
->dropPoisonGeneratingFlags();
634 ASSERT_FALSE(SI
->hasNoUnsignedWrap());
635 ASSERT_FALSE(SI
->hasNoSignedWrap());
639 auto *ShlI
= cast
<Instruction
>(
640 B
.CreateShl(Arg0
, Arg0
, "", /*HasNUW*/ true, /*HasNSW*/ true));
641 ASSERT_TRUE(ShlI
->hasNoSignedWrap());
642 ASSERT_TRUE(ShlI
->hasNoUnsignedWrap());
643 ShlI
->dropPoisonGeneratingFlags();
644 ASSERT_FALSE(ShlI
->hasNoUnsignedWrap());
645 ASSERT_FALSE(ShlI
->hasNoSignedWrap());
649 Value
*GEPBase
= Constant::getNullValue(B
.getInt8PtrTy());
650 auto *GI
= cast
<GetElementPtrInst
>(
651 B
.CreateInBoundsGEP(B
.getInt8Ty(), GEPBase
, Arg0
));
652 ASSERT_TRUE(GI
->isInBounds());
653 GI
->dropPoisonGeneratingFlags();
654 ASSERT_FALSE(GI
->isInBounds());
658 TEST(InstructionsTest
, GEPIndices
) {
660 IRBuilder
<NoFolder
> Builder(Context
);
661 Type
*ElementTy
= Builder
.getInt8Ty();
662 Type
*ArrTy
= ArrayType::get(ArrayType::get(ElementTy
, 64), 64);
665 Builder
.getInt32(13),
666 Builder
.getInt32(42) };
668 Value
*V
= Builder
.CreateGEP(ArrTy
, UndefValue::get(PointerType::getUnqual(ArrTy
)),
670 ASSERT_TRUE(isa
<GetElementPtrInst
>(V
));
672 auto *GEPI
= cast
<GetElementPtrInst
>(V
);
673 ASSERT_NE(GEPI
->idx_begin(), GEPI
->idx_end());
674 ASSERT_EQ(GEPI
->idx_end(), std::next(GEPI
->idx_begin(), 3));
675 EXPECT_EQ(Indices
[0], GEPI
->idx_begin()[0]);
676 EXPECT_EQ(Indices
[1], GEPI
->idx_begin()[1]);
677 EXPECT_EQ(Indices
[2], GEPI
->idx_begin()[2]);
678 EXPECT_EQ(GEPI
->idx_begin(), GEPI
->indices().begin());
679 EXPECT_EQ(GEPI
->idx_end(), GEPI
->indices().end());
681 const auto *CGEPI
= GEPI
;
682 ASSERT_NE(CGEPI
->idx_begin(), CGEPI
->idx_end());
683 ASSERT_EQ(CGEPI
->idx_end(), std::next(CGEPI
->idx_begin(), 3));
684 EXPECT_EQ(Indices
[0], CGEPI
->idx_begin()[0]);
685 EXPECT_EQ(Indices
[1], CGEPI
->idx_begin()[1]);
686 EXPECT_EQ(Indices
[2], CGEPI
->idx_begin()[2]);
687 EXPECT_EQ(CGEPI
->idx_begin(), CGEPI
->indices().begin());
688 EXPECT_EQ(CGEPI
->idx_end(), CGEPI
->indices().end());
693 TEST(InstructionsTest
, SwitchInst
) {
696 std::unique_ptr
<BasicBlock
> BB1
, BB2
, BB3
;
697 BB1
.reset(BasicBlock::Create(C
));
698 BB2
.reset(BasicBlock::Create(C
));
699 BB3
.reset(BasicBlock::Create(C
));
701 // We create block 0 after the others so that it gets destroyed first and
702 // clears the uses of the other basic blocks.
703 std::unique_ptr
<BasicBlock
> BB0(BasicBlock::Create(C
));
705 auto *Int32Ty
= Type::getInt32Ty(C
);
708 SwitchInst::Create(UndefValue::get(Int32Ty
), BB0
.get(), 3, BB0
.get());
709 SI
->addCase(ConstantInt::get(Int32Ty
, 1), BB1
.get());
710 SI
->addCase(ConstantInt::get(Int32Ty
, 2), BB2
.get());
711 SI
->addCase(ConstantInt::get(Int32Ty
, 3), BB3
.get());
713 auto CI
= SI
->case_begin();
714 ASSERT_NE(CI
, SI
->case_end());
715 EXPECT_EQ(1, CI
->getCaseValue()->getSExtValue());
716 EXPECT_EQ(BB1
.get(), CI
->getCaseSuccessor());
717 EXPECT_EQ(2, (CI
+ 1)->getCaseValue()->getSExtValue());
718 EXPECT_EQ(BB2
.get(), (CI
+ 1)->getCaseSuccessor());
719 EXPECT_EQ(3, (CI
+ 2)->getCaseValue()->getSExtValue());
720 EXPECT_EQ(BB3
.get(), (CI
+ 2)->getCaseSuccessor());
721 EXPECT_EQ(CI
+ 1, std::next(CI
));
722 EXPECT_EQ(CI
+ 2, std::next(CI
, 2));
723 EXPECT_EQ(CI
+ 3, std::next(CI
, 3));
724 EXPECT_EQ(SI
->case_end(), CI
+ 3);
725 EXPECT_EQ(0, CI
- CI
);
726 EXPECT_EQ(1, (CI
+ 1) - CI
);
727 EXPECT_EQ(2, (CI
+ 2) - CI
);
728 EXPECT_EQ(3, SI
->case_end() - CI
);
729 EXPECT_EQ(3, std::distance(CI
, SI
->case_end()));
731 auto CCI
= const_cast<const SwitchInst
*>(SI
)->case_begin();
732 SwitchInst::ConstCaseIt CCE
= SI
->case_end();
733 ASSERT_NE(CCI
, SI
->case_end());
734 EXPECT_EQ(1, CCI
->getCaseValue()->getSExtValue());
735 EXPECT_EQ(BB1
.get(), CCI
->getCaseSuccessor());
736 EXPECT_EQ(2, (CCI
+ 1)->getCaseValue()->getSExtValue());
737 EXPECT_EQ(BB2
.get(), (CCI
+ 1)->getCaseSuccessor());
738 EXPECT_EQ(3, (CCI
+ 2)->getCaseValue()->getSExtValue());
739 EXPECT_EQ(BB3
.get(), (CCI
+ 2)->getCaseSuccessor());
740 EXPECT_EQ(CCI
+ 1, std::next(CCI
));
741 EXPECT_EQ(CCI
+ 2, std::next(CCI
, 2));
742 EXPECT_EQ(CCI
+ 3, std::next(CCI
, 3));
743 EXPECT_EQ(CCE
, CCI
+ 3);
744 EXPECT_EQ(0, CCI
- CCI
);
745 EXPECT_EQ(1, (CCI
+ 1) - CCI
);
746 EXPECT_EQ(2, (CCI
+ 2) - CCI
);
747 EXPECT_EQ(3, CCE
- CCI
);
748 EXPECT_EQ(3, std::distance(CCI
, CCE
));
750 // Make sure that the const iterator is compatible with a const auto ref.
751 const auto &Handle
= *CCI
;
752 EXPECT_EQ(1, Handle
.getCaseValue()->getSExtValue());
753 EXPECT_EQ(BB1
.get(), Handle
.getCaseSuccessor());
756 TEST(InstructionsTest
, SwitchInstProfUpdateWrapper
) {
759 std::unique_ptr
<BasicBlock
> BB1
, BB2
, BB3
;
760 BB1
.reset(BasicBlock::Create(C
));
761 BB2
.reset(BasicBlock::Create(C
));
762 BB3
.reset(BasicBlock::Create(C
));
764 // We create block 0 after the others so that it gets destroyed first and
765 // clears the uses of the other basic blocks.
766 std::unique_ptr
<BasicBlock
> BB0(BasicBlock::Create(C
));
768 auto *Int32Ty
= Type::getInt32Ty(C
);
771 SwitchInst::Create(UndefValue::get(Int32Ty
), BB0
.get(), 4, BB0
.get());
772 SI
->addCase(ConstantInt::get(Int32Ty
, 1), BB1
.get());
773 SI
->addCase(ConstantInt::get(Int32Ty
, 2), BB2
.get());
774 SI
->setMetadata(LLVMContext::MD_prof
,
775 MDBuilder(C
).createBranchWeights({ 9, 1, 22 }));
778 SwitchInstProfUpdateWrapper
SIW(*SI
);
779 EXPECT_EQ(*SIW
.getSuccessorWeight(0), 9u);
780 EXPECT_EQ(*SIW
.getSuccessorWeight(1), 1u);
781 EXPECT_EQ(*SIW
.getSuccessorWeight(2), 22u);
782 SIW
.setSuccessorWeight(0, 99u);
783 SIW
.setSuccessorWeight(1, 11u);
784 EXPECT_EQ(*SIW
.getSuccessorWeight(0), 99u);
785 EXPECT_EQ(*SIW
.getSuccessorWeight(1), 11u);
786 EXPECT_EQ(*SIW
.getSuccessorWeight(2), 22u);
789 { // Create another wrapper and check that the data persist.
790 SwitchInstProfUpdateWrapper
SIW(*SI
);
791 EXPECT_EQ(*SIW
.getSuccessorWeight(0), 99u);
792 EXPECT_EQ(*SIW
.getSuccessorWeight(1), 11u);
793 EXPECT_EQ(*SIW
.getSuccessorWeight(2), 22u);
797 TEST(InstructionsTest
, CommuteShuffleMask
) {
798 SmallVector
<int, 16> Indices({-1, 0, 7});
799 ShuffleVectorInst::commuteShuffleMask(Indices
, 4);
800 EXPECT_THAT(Indices
, testing::ContainerEq(ArrayRef
<int>({-1, 4, 3})));
803 TEST(InstructionsTest
, ShuffleMaskQueries
) {
804 // Create the elements for various constant vectors.
806 Type
*Int32Ty
= Type::getInt32Ty(Ctx
);
807 Constant
*CU
= UndefValue::get(Int32Ty
);
808 Constant
*C0
= ConstantInt::get(Int32Ty
, 0);
809 Constant
*C1
= ConstantInt::get(Int32Ty
, 1);
810 Constant
*C2
= ConstantInt::get(Int32Ty
, 2);
811 Constant
*C3
= ConstantInt::get(Int32Ty
, 3);
812 Constant
*C4
= ConstantInt::get(Int32Ty
, 4);
813 Constant
*C5
= ConstantInt::get(Int32Ty
, 5);
814 Constant
*C6
= ConstantInt::get(Int32Ty
, 6);
815 Constant
*C7
= ConstantInt::get(Int32Ty
, 7);
817 Constant
*Identity
= ConstantVector::get({C0
, CU
, C2
, C3
, C4
});
818 EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(Identity
));
819 EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Identity
)); // identity is distinguished from select
820 EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Identity
));
821 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(Identity
)); // identity is always single source
822 EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Identity
));
823 EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Identity
));
825 Constant
*Select
= ConstantVector::get({CU
, C1
, C5
});
826 EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Select
));
827 EXPECT_TRUE(ShuffleVectorInst::isSelectMask(Select
));
828 EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Select
));
829 EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(Select
));
830 EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Select
));
831 EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Select
));
833 Constant
*Reverse
= ConstantVector::get({C3
, C2
, C1
, CU
});
834 EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Reverse
));
835 EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Reverse
));
836 EXPECT_TRUE(ShuffleVectorInst::isReverseMask(Reverse
));
837 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(Reverse
)); // reverse is always single source
838 EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Reverse
));
839 EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(Reverse
));
841 Constant
*SingleSource
= ConstantVector::get({C2
, C2
, C0
, CU
});
842 EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(SingleSource
));
843 EXPECT_FALSE(ShuffleVectorInst::isSelectMask(SingleSource
));
844 EXPECT_FALSE(ShuffleVectorInst::isReverseMask(SingleSource
));
845 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(SingleSource
));
846 EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(SingleSource
));
847 EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(SingleSource
));
849 Constant
*ZeroEltSplat
= ConstantVector::get({C0
, C0
, CU
, C0
});
850 EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(ZeroEltSplat
));
851 EXPECT_FALSE(ShuffleVectorInst::isSelectMask(ZeroEltSplat
));
852 EXPECT_FALSE(ShuffleVectorInst::isReverseMask(ZeroEltSplat
));
853 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ZeroEltSplat
)); // 0-splat is always single source
854 EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ZeroEltSplat
));
855 EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(ZeroEltSplat
));
857 Constant
*Transpose
= ConstantVector::get({C0
, C4
, C2
, C6
});
858 EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(Transpose
));
859 EXPECT_FALSE(ShuffleVectorInst::isSelectMask(Transpose
));
860 EXPECT_FALSE(ShuffleVectorInst::isReverseMask(Transpose
));
861 EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(Transpose
));
862 EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(Transpose
));
863 EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(Transpose
));
865 // More tests to make sure the logic is/stays correct...
866 EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(ConstantVector::get({CU
, C1
, CU
, C3
})));
867 EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(ConstantVector::get({C4
, CU
, C6
, CU
})));
869 EXPECT_TRUE(ShuffleVectorInst::isSelectMask(ConstantVector::get({C4
, C1
, C6
, CU
})));
870 EXPECT_TRUE(ShuffleVectorInst::isSelectMask(ConstantVector::get({CU
, C1
, C6
, C3
})));
872 EXPECT_TRUE(ShuffleVectorInst::isReverseMask(ConstantVector::get({C7
, C6
, CU
, C4
})));
873 EXPECT_TRUE(ShuffleVectorInst::isReverseMask(ConstantVector::get({C3
, CU
, C1
, CU
})));
875 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ConstantVector::get({C7
, C5
, CU
, C7
})));
876 EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(ConstantVector::get({C3
, C0
, CU
, C3
})));
878 EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ConstantVector::get({C4
, CU
, CU
, C4
})));
879 EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(ConstantVector::get({CU
, C0
, CU
, C0
})));
881 EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1
, C5
, C3
, C7
})));
882 EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1
, C3
})));
884 // Nothing special about the values here - just re-using inputs to reduce code.
885 Constant
*V0
= ConstantVector::get({C0
, C1
, C2
, C3
});
886 Constant
*V1
= ConstantVector::get({C3
, C2
, C1
, C0
});
888 // Identity with undef elts.
889 ShuffleVectorInst
*Id1
= new ShuffleVectorInst(V0
, V1
,
890 ConstantVector::get({C0
, C1
, CU
, CU
}));
891 EXPECT_TRUE(Id1
->isIdentity());
892 EXPECT_FALSE(Id1
->isIdentityWithPadding());
893 EXPECT_FALSE(Id1
->isIdentityWithExtract());
894 EXPECT_FALSE(Id1
->isConcat());
897 // Result has less elements than operands.
898 ShuffleVectorInst
*Id2
= new ShuffleVectorInst(V0
, V1
,
899 ConstantVector::get({C0
, C1
, C2
}));
900 EXPECT_FALSE(Id2
->isIdentity());
901 EXPECT_FALSE(Id2
->isIdentityWithPadding());
902 EXPECT_TRUE(Id2
->isIdentityWithExtract());
903 EXPECT_FALSE(Id2
->isConcat());
906 // Result has less elements than operands; choose from Op1.
907 ShuffleVectorInst
*Id3
= new ShuffleVectorInst(V0
, V1
,
908 ConstantVector::get({C4
, CU
, C6
}));
909 EXPECT_FALSE(Id3
->isIdentity());
910 EXPECT_FALSE(Id3
->isIdentityWithPadding());
911 EXPECT_TRUE(Id3
->isIdentityWithExtract());
912 EXPECT_FALSE(Id3
->isConcat());
915 // Result has less elements than operands; choose from Op0 and Op1 is not identity.
916 ShuffleVectorInst
*Id4
= new ShuffleVectorInst(V0
, V1
,
917 ConstantVector::get({C4
, C1
, C6
}));
918 EXPECT_FALSE(Id4
->isIdentity());
919 EXPECT_FALSE(Id4
->isIdentityWithPadding());
920 EXPECT_FALSE(Id4
->isIdentityWithExtract());
921 EXPECT_FALSE(Id4
->isConcat());
924 // Result has more elements than operands, and extra elements are undef.
925 ShuffleVectorInst
*Id5
= new ShuffleVectorInst(V0
, V1
,
926 ConstantVector::get({CU
, C1
, C2
, C3
, CU
, CU
}));
927 EXPECT_FALSE(Id5
->isIdentity());
928 EXPECT_TRUE(Id5
->isIdentityWithPadding());
929 EXPECT_FALSE(Id5
->isIdentityWithExtract());
930 EXPECT_FALSE(Id5
->isConcat());
933 // Result has more elements than operands, and extra elements are undef; choose from Op1.
934 ShuffleVectorInst
*Id6
= new ShuffleVectorInst(V0
, V1
,
935 ConstantVector::get({C4
, C5
, C6
, CU
, CU
, CU
}));
936 EXPECT_FALSE(Id6
->isIdentity());
937 EXPECT_TRUE(Id6
->isIdentityWithPadding());
938 EXPECT_FALSE(Id6
->isIdentityWithExtract());
939 EXPECT_FALSE(Id6
->isConcat());
942 // Result has more elements than operands, but extra elements are not undef.
943 ShuffleVectorInst
*Id7
= new ShuffleVectorInst(V0
, V1
,
944 ConstantVector::get({C0
, C1
, C2
, C3
, CU
, C1
}));
945 EXPECT_FALSE(Id7
->isIdentity());
946 EXPECT_FALSE(Id7
->isIdentityWithPadding());
947 EXPECT_FALSE(Id7
->isIdentityWithExtract());
948 EXPECT_FALSE(Id7
->isConcat());
951 // Result has more elements than operands; choose from Op0 and Op1 is not identity.
952 ShuffleVectorInst
*Id8
= new ShuffleVectorInst(V0
, V1
,
953 ConstantVector::get({C4
, CU
, C2
, C3
, CU
, CU
}));
954 EXPECT_FALSE(Id8
->isIdentity());
955 EXPECT_FALSE(Id8
->isIdentityWithPadding());
956 EXPECT_FALSE(Id8
->isIdentityWithExtract());
957 EXPECT_FALSE(Id8
->isConcat());
960 // Result has twice as many elements as operands; choose consecutively from Op0 and Op1 is concat.
961 ShuffleVectorInst
*Id9
= new ShuffleVectorInst(V0
, V1
,
962 ConstantVector::get({C0
, CU
, C2
, C3
, CU
, CU
, C6
, C7
}));
963 EXPECT_FALSE(Id9
->isIdentity());
964 EXPECT_FALSE(Id9
->isIdentityWithPadding());
965 EXPECT_FALSE(Id9
->isIdentityWithExtract());
966 EXPECT_TRUE(Id9
->isConcat());
969 // Result has less than twice as many elements as operands, so not a concat.
970 ShuffleVectorInst
*Id10
= new ShuffleVectorInst(V0
, V1
,
971 ConstantVector::get({C0
, CU
, C2
, C3
, CU
, CU
, C6
}));
972 EXPECT_FALSE(Id10
->isIdentity());
973 EXPECT_FALSE(Id10
->isIdentityWithPadding());
974 EXPECT_FALSE(Id10
->isIdentityWithExtract());
975 EXPECT_FALSE(Id10
->isConcat());
978 // Result has more than twice as many elements as operands, so not a concat.
979 ShuffleVectorInst
*Id11
= new ShuffleVectorInst(V0
, V1
,
980 ConstantVector::get({C0
, CU
, C2
, C3
, CU
, CU
, C6
, C7
, CU
}));
981 EXPECT_FALSE(Id11
->isIdentity());
982 EXPECT_FALSE(Id11
->isIdentityWithPadding());
983 EXPECT_FALSE(Id11
->isIdentityWithExtract());
984 EXPECT_FALSE(Id11
->isConcat());
987 // If an input is undef, it's not a concat.
988 // TODO: IdentityWithPadding should be true here even though the high mask values are not undef.
989 ShuffleVectorInst
*Id12
= new ShuffleVectorInst(V0
, ConstantVector::get({CU
, CU
, CU
, CU
}),
990 ConstantVector::get({C0
, CU
, C2
, C3
, CU
, CU
, C6
, C7
}));
991 EXPECT_FALSE(Id12
->isIdentity());
992 EXPECT_FALSE(Id12
->isIdentityWithPadding());
993 EXPECT_FALSE(Id12
->isIdentityWithExtract());
994 EXPECT_FALSE(Id12
->isConcat());
998 TEST(InstructionsTest
, SkipDebug
) {
1000 std::unique_ptr
<Module
> M
= parseIR(C
,
1002 declare void @llvm.dbg.value(metadata, metadata, metadata)
1006 call void @llvm.dbg.value(metadata i32 0, metadata !11, metadata !DIExpression()), !dbg !13
1010 !llvm.dbg.cu = !{!0}
1011 !llvm.module.flags = !{!3, !4}
1012 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version
6.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
1013 !1 = !DIFile(filename: "t2
.c
", directory: "foo
")
1015 !3 = !{i32 2, !"Dwarf Version
", i32 4}
1016 !4 = !{i32 2, !"Debug Info Version
", i32 3}
1017 !8 = distinct !DISubprogram(name: "f
", scope: !1, file: !1, line: 1, type: !9, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, unit: !0, retainedNodes: !2)
1018 !9 = !DISubroutineType(types: !10)
1020 !11 = !DILocalVariable(name: "x
", scope: !8, file: !1, line: 2, type: !12)
1021 !12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
1022 !13 = !DILocation(line: 2, column: 7, scope: !8)
1025 Function
*F
= cast
<Function
>(M
->getNamedValue("f"));
1026 BasicBlock
&BB
= F
->front();
1028 // The first non-debug instruction is the terminator.
1029 auto *Term
= BB
.getTerminator();
1030 EXPECT_EQ(Term
, BB
.begin()->getNextNonDebugInstruction());
1031 EXPECT_EQ(Term
->getIterator(), skipDebugIntrinsics(BB
.begin()));
1033 // After the terminator, there are no non-debug instructions.
1034 EXPECT_EQ(nullptr, Term
->getNextNonDebugInstruction());
1037 TEST(InstructionsTest
, PhiMightNotBeFPMathOperator
) {
1038 LLVMContext Context
;
1039 IRBuilder
<> Builder(Context
);
1040 MDBuilder
MDHelper(Context
);
1041 Instruction
*I
= Builder
.CreatePHI(Builder
.getInt32Ty(), 0);
1042 EXPECT_FALSE(isa
<FPMathOperator
>(I
));
1044 Instruction
*FP
= Builder
.CreatePHI(Builder
.getDoubleTy(), 0);
1045 EXPECT_TRUE(isa
<FPMathOperator
>(FP
));
1049 TEST(InstructionsTest
, FNegInstruction
) {
1050 LLVMContext Context
;
1051 Type
*FltTy
= Type::getFloatTy(Context
);
1052 Constant
*One
= ConstantFP::get(FltTy
, 1.0);
1053 BinaryOperator
*FAdd
= BinaryOperator::CreateFAdd(One
, One
);
1054 FAdd
->setHasNoNaNs(true);
1055 UnaryOperator
*FNeg
= UnaryOperator::CreateFNegFMF(One
, FAdd
);
1056 EXPECT_TRUE(FNeg
->hasNoNaNs());
1057 EXPECT_FALSE(FNeg
->hasNoInfs());
1058 EXPECT_FALSE(FNeg
->hasNoSignedZeros());
1059 EXPECT_FALSE(FNeg
->hasAllowReciprocal());
1060 EXPECT_FALSE(FNeg
->hasAllowContract());
1061 EXPECT_FALSE(FNeg
->hasAllowReassoc());
1062 EXPECT_FALSE(FNeg
->hasApproxFunc());
1063 FAdd
->deleteValue();
1064 FNeg
->deleteValue();
1067 TEST(InstructionsTest
, CallBrInstruction
) {
1068 LLVMContext Context
;
1069 std::unique_ptr
<Module
> M
= parseIR(Context
, R
"(
1070 define void @foo() {
1072 callbr void asm sideeffect "// XXX: ${0:l}", "X"(i8* blockaddress(@foo, %branch_test.exit))
1073 to label
%land
.rhs
.i
[label
%branch_test
.exit
]
1076 br label
%branch_test
.exit
1079 %0 = phi i1
[ true, %entry
], [ false, %land
.rhs
.i
]
1080 br i1
%0, label
%if.end
, label
%if.then
1089 Function *Foo = M->getFunction("foo
");
1090 auto BBs = Foo->getBasicBlockList().begin();
1091 CallBrInst &CBI = cast<CallBrInst>(BBs->front());
1094 BasicBlock &BranchTestExit = *BBs;
1096 BasicBlock &IfThen = *BBs;
1098 // Test that setting the first indirect destination of callbr updates the dest
1099 EXPECT_EQ(&BranchTestExit, CBI.getIndirectDest(0));
1100 CBI.setIndirectDest(0, &IfThen);
1101 EXPECT_EQ(&IfThen, CBI.getIndirectDest(0));
1103 // Further, test that changing the indirect destination updates the arg
1104 // operand to use the block address of the new indirect destination basic
1105 // block. This is a critical invariant of CallBrInst.
1106 BlockAddress *IndirectBA = BlockAddress::get(CBI.getIndirectDest(0));
1107 BlockAddress *ArgBA = cast<BlockAddress>(CBI.getArgOperand(0));
1108 EXPECT_EQ(IndirectBA, ArgBA)
1109 << "After setting the indirect destination
, callbr had an indirect
"
1111 << CBI.getIndirectDest(0)->getName() << "', but a argument of
'"
1112 << ArgBA->getBasicBlock()->getName() << "'. These should always match
:\n"
1114 EXPECT_EQ(IndirectBA->getBasicBlock(), &IfThen);
1115 EXPECT_EQ(ArgBA->getBasicBlock(), &IfThen);
1118 TEST(InstructionsTest, UnaryOperator) {
1119 LLVMContext Context;
1120 IRBuilder<> Builder(Context);
1121 Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
1122 Value *F = Builder.CreateFNeg(I);
1124 EXPECT_TRUE(isa<Value>(F));
1125 EXPECT_TRUE(isa<Instruction>(F));
1126 EXPECT_TRUE(isa<UnaryInstruction>(F));
1127 EXPECT_TRUE(isa<UnaryOperator>(F));
1128 EXPECT_FALSE(isa<BinaryOperator>(F));
1134 } // end anonymous namespace
1135 } // end namespace llvm