1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/IR/InstructionsTest.cpp - Instructions unit tests ----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ValueTracking.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/BasicBlock.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRBuilder.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/MDBuilder.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Operator.h"
23*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9880d681SAndroid Build Coastguard Worker #include <memory>
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker namespace llvm {
27*9880d681SAndroid Build Coastguard Worker namespace {
28*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,ReturnInst)29*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, ReturnInst) {
30*9880d681SAndroid Build Coastguard Worker LLVMContext C;
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker // test for PR6589
33*9880d681SAndroid Build Coastguard Worker const ReturnInst* r0 = ReturnInst::Create(C);
34*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(r0->getNumOperands(), 0U);
35*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(r0->op_begin(), r0->op_end());
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker IntegerType* Int1 = IntegerType::get(C, 1);
38*9880d681SAndroid Build Coastguard Worker Constant* One = ConstantInt::get(Int1, 1, true);
39*9880d681SAndroid Build Coastguard Worker const ReturnInst* r1 = ReturnInst::Create(C, One);
40*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, r1->getNumOperands());
41*9880d681SAndroid Build Coastguard Worker User::const_op_iterator b(r1->op_begin());
42*9880d681SAndroid Build Coastguard Worker EXPECT_NE(r1->op_end(), b);
43*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, *b);
44*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, r1->getOperand(0));
45*9880d681SAndroid Build Coastguard Worker ++b;
46*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(r1->op_end(), b);
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker // clean up
49*9880d681SAndroid Build Coastguard Worker delete r0;
50*9880d681SAndroid Build Coastguard Worker delete r1;
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker // Test fixture that provides a module and a single function within it. Useful
54*9880d681SAndroid Build Coastguard Worker // for tests that need to refer to the function in some way.
55*9880d681SAndroid Build Coastguard Worker class ModuleWithFunctionTest : public testing::Test {
56*9880d681SAndroid Build Coastguard Worker protected:
ModuleWithFunctionTest()57*9880d681SAndroid Build Coastguard Worker ModuleWithFunctionTest() : M(new Module("MyModule", Ctx)) {
58*9880d681SAndroid Build Coastguard Worker FArgTypes.push_back(Type::getInt8Ty(Ctx));
59*9880d681SAndroid Build Coastguard Worker FArgTypes.push_back(Type::getInt32Ty(Ctx));
60*9880d681SAndroid Build Coastguard Worker FArgTypes.push_back(Type::getInt64Ty(Ctx));
61*9880d681SAndroid Build Coastguard Worker FunctionType *FTy =
62*9880d681SAndroid Build Coastguard Worker FunctionType::get(Type::getVoidTy(Ctx), FArgTypes, false);
63*9880d681SAndroid Build Coastguard Worker F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker LLVMContext Ctx;
67*9880d681SAndroid Build Coastguard Worker std::unique_ptr<Module> M;
68*9880d681SAndroid Build Coastguard Worker SmallVector<Type *, 3> FArgTypes;
69*9880d681SAndroid Build Coastguard Worker Function *F;
70*9880d681SAndroid Build Coastguard Worker };
71*9880d681SAndroid Build Coastguard Worker
TEST_F(ModuleWithFunctionTest,CallInst)72*9880d681SAndroid Build Coastguard Worker TEST_F(ModuleWithFunctionTest, CallInst) {
73*9880d681SAndroid Build Coastguard Worker Value *Args[] = {ConstantInt::get(Type::getInt8Ty(Ctx), 20),
74*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt32Ty(Ctx), 9999),
75*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt64Ty(Ctx), 42)};
76*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Call(CallInst::Create(F, Args));
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker // Make sure iteration over a call's arguments works as expected.
79*9880d681SAndroid Build Coastguard Worker unsigned Idx = 0;
80*9880d681SAndroid Build Coastguard Worker for (Value *Arg : Call->arg_operands()) {
81*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(FArgTypes[Idx], Arg->getType());
82*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getArgOperand(Idx)->getType(), Arg->getType());
83*9880d681SAndroid Build Coastguard Worker Idx++;
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker }
86*9880d681SAndroid Build Coastguard Worker
TEST_F(ModuleWithFunctionTest,InvokeInst)87*9880d681SAndroid Build Coastguard Worker TEST_F(ModuleWithFunctionTest, InvokeInst) {
88*9880d681SAndroid Build Coastguard Worker BasicBlock *BB1 = BasicBlock::Create(Ctx, "", F);
89*9880d681SAndroid Build Coastguard Worker BasicBlock *BB2 = BasicBlock::Create(Ctx, "", F);
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker Value *Args[] = {ConstantInt::get(Type::getInt8Ty(Ctx), 20),
92*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt32Ty(Ctx), 9999),
93*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Type::getInt64Ty(Ctx), 42)};
94*9880d681SAndroid Build Coastguard Worker std::unique_ptr<InvokeInst> Invoke(InvokeInst::Create(F, BB1, BB2, Args));
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker // Make sure iteration over invoke's arguments works as expected.
97*9880d681SAndroid Build Coastguard Worker unsigned Idx = 0;
98*9880d681SAndroid Build Coastguard Worker for (Value *Arg : Invoke->arg_operands()) {
99*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(FArgTypes[Idx], Arg->getType());
100*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getArgOperand(Idx)->getType(), Arg->getType());
101*9880d681SAndroid Build Coastguard Worker Idx++;
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker }
104*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,BranchInst)105*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, BranchInst) {
106*9880d681SAndroid Build Coastguard Worker LLVMContext C;
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker // Make a BasicBlocks
109*9880d681SAndroid Build Coastguard Worker BasicBlock* bb0 = BasicBlock::Create(C);
110*9880d681SAndroid Build Coastguard Worker BasicBlock* bb1 = BasicBlock::Create(C);
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker // Mandatory BranchInst
113*9880d681SAndroid Build Coastguard Worker const BranchInst* b0 = BranchInst::Create(bb0);
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b0->isUnconditional());
116*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b0->isConditional());
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, b0->getNumSuccessors());
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker // check num operands
120*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1U, b0->getNumOperands());
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker EXPECT_NE(b0->op_begin(), b0->op_end());
123*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(b0->op_end(), std::next(b0->op_begin()));
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(b0->op_end(), std::next(b0->op_begin()));
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker IntegerType* Int1 = IntegerType::get(C, 1);
128*9880d681SAndroid Build Coastguard Worker Constant* One = ConstantInt::get(Int1, 1, true);
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker // Conditional BranchInst
131*9880d681SAndroid Build Coastguard Worker BranchInst* b1 = BranchInst::Create(bb0, bb1, One);
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(b1->isUnconditional());
134*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(b1->isConditional());
135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2U, b1->getNumSuccessors());
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker // check num operands
138*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(3U, b1->getNumOperands());
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker User::const_op_iterator b(b1->op_begin());
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker // check COND
143*9880d681SAndroid Build Coastguard Worker EXPECT_NE(b, b1->op_end());
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, *b);
145*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, b1->getOperand(0));
146*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, b1->getCondition());
147*9880d681SAndroid Build Coastguard Worker ++b;
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker // check ELSE
150*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb1, *b);
151*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb1, b1->getOperand(1));
152*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb1, b1->getSuccessor(1));
153*9880d681SAndroid Build Coastguard Worker ++b;
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker // check THEN
156*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb0, *b);
157*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb0, b1->getOperand(2));
158*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bb0, b1->getSuccessor(0));
159*9880d681SAndroid Build Coastguard Worker ++b;
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(b1->op_end(), b);
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker // clean up
164*9880d681SAndroid Build Coastguard Worker delete b0;
165*9880d681SAndroid Build Coastguard Worker delete b1;
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker delete bb0;
168*9880d681SAndroid Build Coastguard Worker delete bb1;
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,CastInst)171*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, CastInst) {
172*9880d681SAndroid Build Coastguard Worker LLVMContext C;
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker Type *Int8Ty = Type::getInt8Ty(C);
175*9880d681SAndroid Build Coastguard Worker Type *Int16Ty = Type::getInt16Ty(C);
176*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(C);
177*9880d681SAndroid Build Coastguard Worker Type *Int64Ty = Type::getInt64Ty(C);
178*9880d681SAndroid Build Coastguard Worker Type *V8x8Ty = VectorType::get(Int8Ty, 8);
179*9880d681SAndroid Build Coastguard Worker Type *V8x64Ty = VectorType::get(Int64Ty, 8);
180*9880d681SAndroid Build Coastguard Worker Type *X86MMXTy = Type::getX86_MMXTy(C);
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker Type *HalfTy = Type::getHalfTy(C);
183*9880d681SAndroid Build Coastguard Worker Type *FloatTy = Type::getFloatTy(C);
184*9880d681SAndroid Build Coastguard Worker Type *DoubleTy = Type::getDoubleTy(C);
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker Type *V2Int32Ty = VectorType::get(Int32Ty, 2);
187*9880d681SAndroid Build Coastguard Worker Type *V2Int64Ty = VectorType::get(Int64Ty, 2);
188*9880d681SAndroid Build Coastguard Worker Type *V4Int16Ty = VectorType::get(Int16Ty, 4);
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker Type *Int32PtrTy = PointerType::get(Int32Ty, 0);
191*9880d681SAndroid Build Coastguard Worker Type *Int64PtrTy = PointerType::get(Int64Ty, 0);
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker Type *Int32PtrAS1Ty = PointerType::get(Int32Ty, 1);
194*9880d681SAndroid Build Coastguard Worker Type *Int64PtrAS1Ty = PointerType::get(Int64Ty, 1);
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker Type *V2Int32PtrAS1Ty = VectorType::get(Int32PtrAS1Ty, 2);
197*9880d681SAndroid Build Coastguard Worker Type *V2Int64PtrAS1Ty = VectorType::get(Int64PtrAS1Ty, 2);
198*9880d681SAndroid Build Coastguard Worker Type *V4Int32PtrAS1Ty = VectorType::get(Int32PtrAS1Ty, 4);
199*9880d681SAndroid Build Coastguard Worker Type *V4Int64PtrAS1Ty = VectorType::get(Int64PtrAS1Ty, 4);
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker Type *V2Int64PtrTy = VectorType::get(Int64PtrTy, 2);
202*9880d681SAndroid Build Coastguard Worker Type *V2Int32PtrTy = VectorType::get(Int32PtrTy, 2);
203*9880d681SAndroid Build Coastguard Worker Type *V4Int32PtrTy = VectorType::get(Int32PtrTy, 4);
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker const Constant* c8 = Constant::getNullValue(V8x8Ty);
206*9880d681SAndroid Build Coastguard Worker const Constant* c64 = Constant::getNullValue(V8x64Ty);
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker const Constant *v2ptr32 = Constant::getNullValue(V2Int32PtrTy);
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isCastable(V8x8Ty, X86MMXTy));
211*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isCastable(X86MMXTy, V8x8Ty));
212*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isCastable(Int64Ty, X86MMXTy));
213*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isCastable(V8x64Ty, V8x8Ty));
214*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isCastable(V8x8Ty, V8x64Ty));
215*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::Trunc, CastInst::getCastOpcode(c64, true, V8x8Ty, true));
216*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::SExt, CastInst::getCastOpcode(c8, true, V8x64Ty, true));
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty, X86MMXTy));
219*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(X86MMXTy, V8x8Ty));
220*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, X86MMXTy));
221*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V8x64Ty, V8x8Ty));
222*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty, V8x64Ty));
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker // Check address space casts are rejected since we don't know the sizes here
225*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, Int32PtrAS1Ty));
226*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int32PtrAS1Ty, Int32PtrTy));
227*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, V2Int32PtrAS1Ty));
228*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int32PtrTy));
229*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int64PtrAS1Ty));
230*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isCastable(V2Int32PtrAS1Ty, V2Int32PtrTy));
231*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::AddrSpaceCast, CastInst::getCastOpcode(v2ptr32, true,
232*9880d681SAndroid Build Coastguard Worker V2Int32PtrAS1Ty,
233*9880d681SAndroid Build Coastguard Worker true));
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker // Test mismatched number of elements for pointers
236*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int64PtrAS1Ty));
237*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V4Int64PtrAS1Ty, V2Int32PtrAS1Ty));
238*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int32PtrAS1Ty));
239*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, V2Int32PtrTy));
240*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int32PtrTy));
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(Int32PtrTy, Int64PtrTy));
243*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(DoubleTy, FloatTy));
244*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(FloatTy, DoubleTy));
245*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy));
246*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy));
247*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(FloatTy, Int32Ty));
248*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(Int16Ty, HalfTy));
249*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(Int32Ty, FloatTy));
250*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, Int64Ty));
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, V4Int16Ty));
253*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int32Ty, Int64Ty));
254*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, Int32Ty));
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int64Ty));
257*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, V2Int32PtrTy));
258*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(V2Int64PtrTy, V2Int32PtrTy));
259*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrTy, V2Int64PtrTy));
260*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int32Ty, V2Int64Ty));
261*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::isBitCastable(V2Int64Ty, V2Int32Ty));
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
265*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(V4Int32PtrTy),
266*9880d681SAndroid Build Coastguard Worker V2Int32PtrTy));
267*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
268*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(V2Int32PtrTy),
269*9880d681SAndroid Build Coastguard Worker V4Int32PtrTy));
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
272*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(V4Int32PtrAS1Ty),
273*9880d681SAndroid Build Coastguard Worker V2Int32PtrTy));
274*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
275*9880d681SAndroid Build Coastguard Worker Constant::getNullValue(V2Int32PtrTy),
276*9880d681SAndroid Build Coastguard Worker V4Int32PtrAS1Ty));
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker // Check that assertion is not hit when creating a cast with a vector of
280*9880d681SAndroid Build Coastguard Worker // pointers
281*9880d681SAndroid Build Coastguard Worker // First form
282*9880d681SAndroid Build Coastguard Worker BasicBlock *BB = BasicBlock::Create(C);
283*9880d681SAndroid Build Coastguard Worker Constant *NullV2I32Ptr = Constant::getNullValue(V2Int32PtrTy);
284*9880d681SAndroid Build Coastguard Worker auto Inst1 = CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty, "foo", BB);
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker // Second form
287*9880d681SAndroid Build Coastguard Worker auto Inst2 = CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty);
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Worker delete Inst2;
290*9880d681SAndroid Build Coastguard Worker Inst1->eraseFromParent();
291*9880d681SAndroid Build Coastguard Worker delete BB;
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,VectorGep)294*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, VectorGep) {
295*9880d681SAndroid Build Coastguard Worker LLVMContext C;
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker // Type Definitions
298*9880d681SAndroid Build Coastguard Worker Type *I8Ty = IntegerType::get(C, 8);
299*9880d681SAndroid Build Coastguard Worker Type *I32Ty = IntegerType::get(C, 32);
300*9880d681SAndroid Build Coastguard Worker PointerType *Ptri8Ty = PointerType::get(I8Ty, 0);
301*9880d681SAndroid Build Coastguard Worker PointerType *Ptri32Ty = PointerType::get(I32Ty, 0);
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker VectorType *V2xi8PTy = VectorType::get(Ptri8Ty, 2);
304*9880d681SAndroid Build Coastguard Worker VectorType *V2xi32PTy = VectorType::get(Ptri32Ty, 2);
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker // Test different aspects of the vector-of-pointers type
307*9880d681SAndroid Build Coastguard Worker // and GEPs which use this type.
308*9880d681SAndroid Build Coastguard Worker ConstantInt *Ci32a = ConstantInt::get(C, APInt(32, 1492));
309*9880d681SAndroid Build Coastguard Worker ConstantInt *Ci32b = ConstantInt::get(C, APInt(32, 1948));
310*9880d681SAndroid Build Coastguard Worker std::vector<Constant*> ConstVa(2, Ci32a);
311*9880d681SAndroid Build Coastguard Worker std::vector<Constant*> ConstVb(2, Ci32b);
312*9880d681SAndroid Build Coastguard Worker Constant *C2xi32a = ConstantVector::get(ConstVa);
313*9880d681SAndroid Build Coastguard Worker Constant *C2xi32b = ConstantVector::get(ConstVb);
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker CastInst *PtrVecA = new IntToPtrInst(C2xi32a, V2xi32PTy);
316*9880d681SAndroid Build Coastguard Worker CastInst *PtrVecB = new IntToPtrInst(C2xi32b, V2xi32PTy);
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker ICmpInst *ICmp0 = new ICmpInst(ICmpInst::ICMP_SGT, PtrVecA, PtrVecB);
319*9880d681SAndroid Build Coastguard Worker ICmpInst *ICmp1 = new ICmpInst(ICmpInst::ICMP_ULT, PtrVecA, PtrVecB);
320*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ICmp0, ICmp1); // suppress warning.
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker BasicBlock* BB0 = BasicBlock::Create(C);
323*9880d681SAndroid Build Coastguard Worker // Test InsertAtEnd ICmpInst constructor.
324*9880d681SAndroid Build Coastguard Worker ICmpInst *ICmp2 = new ICmpInst(*BB0, ICmpInst::ICMP_SGE, PtrVecA, PtrVecB);
325*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ICmp0, ICmp2); // suppress warning.
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *Gep0 = GetElementPtrInst::Create(I32Ty, PtrVecA, C2xi32a);
328*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *Gep1 = GetElementPtrInst::Create(I32Ty, PtrVecA, C2xi32b);
329*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *Gep2 = GetElementPtrInst::Create(I32Ty, PtrVecB, C2xi32a);
330*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *Gep3 = GetElementPtrInst::Create(I32Ty, PtrVecB, C2xi32b);
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker CastInst *BTC0 = new BitCastInst(Gep0, V2xi8PTy);
333*9880d681SAndroid Build Coastguard Worker CastInst *BTC1 = new BitCastInst(Gep1, V2xi8PTy);
334*9880d681SAndroid Build Coastguard Worker CastInst *BTC2 = new BitCastInst(Gep2, V2xi8PTy);
335*9880d681SAndroid Build Coastguard Worker CastInst *BTC3 = new BitCastInst(Gep3, V2xi8PTy);
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker Value *S0 = BTC0->stripPointerCasts();
338*9880d681SAndroid Build Coastguard Worker Value *S1 = BTC1->stripPointerCasts();
339*9880d681SAndroid Build Coastguard Worker Value *S2 = BTC2->stripPointerCasts();
340*9880d681SAndroid Build Coastguard Worker Value *S3 = BTC3->stripPointerCasts();
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Worker EXPECT_NE(S0, Gep0);
343*9880d681SAndroid Build Coastguard Worker EXPECT_NE(S1, Gep1);
344*9880d681SAndroid Build Coastguard Worker EXPECT_NE(S2, Gep2);
345*9880d681SAndroid Build Coastguard Worker EXPECT_NE(S3, Gep3);
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker int64_t Offset;
348*9880d681SAndroid Build Coastguard Worker DataLayout TD("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3"
349*9880d681SAndroid Build Coastguard Worker "2:32:32-f64:64:64-v64:64:64-v128:128:128-a:0:64-s:64:64-f80"
350*9880d681SAndroid Build Coastguard Worker ":128:128-n8:16:32:64-S128");
351*9880d681SAndroid Build Coastguard Worker // Make sure we don't crash
352*9880d681SAndroid Build Coastguard Worker GetPointerBaseWithConstantOffset(Gep0, Offset, TD);
353*9880d681SAndroid Build Coastguard Worker GetPointerBaseWithConstantOffset(Gep1, Offset, TD);
354*9880d681SAndroid Build Coastguard Worker GetPointerBaseWithConstantOffset(Gep2, Offset, TD);
355*9880d681SAndroid Build Coastguard Worker GetPointerBaseWithConstantOffset(Gep3, Offset, TD);
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker // Gep of Geps
358*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *GepII0 = GetElementPtrInst::Create(I32Ty, Gep0, C2xi32b);
359*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *GepII1 = GetElementPtrInst::Create(I32Ty, Gep1, C2xi32a);
360*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *GepII2 = GetElementPtrInst::Create(I32Ty, Gep2, C2xi32b);
361*9880d681SAndroid Build Coastguard Worker GetElementPtrInst *GepII3 = GetElementPtrInst::Create(I32Ty, Gep3, C2xi32a);
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(GepII0->getNumIndices(), 1u);
364*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(GepII1->getNumIndices(), 1u);
365*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(GepII2->getNumIndices(), 1u);
366*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(GepII3->getNumIndices(), 1u);
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(GepII0->hasAllZeroIndices());
369*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(GepII1->hasAllZeroIndices());
370*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(GepII2->hasAllZeroIndices());
371*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(GepII3->hasAllZeroIndices());
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker delete GepII0;
374*9880d681SAndroid Build Coastguard Worker delete GepII1;
375*9880d681SAndroid Build Coastguard Worker delete GepII2;
376*9880d681SAndroid Build Coastguard Worker delete GepII3;
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker delete BTC0;
379*9880d681SAndroid Build Coastguard Worker delete BTC1;
380*9880d681SAndroid Build Coastguard Worker delete BTC2;
381*9880d681SAndroid Build Coastguard Worker delete BTC3;
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker delete Gep0;
384*9880d681SAndroid Build Coastguard Worker delete Gep1;
385*9880d681SAndroid Build Coastguard Worker delete Gep2;
386*9880d681SAndroid Build Coastguard Worker delete Gep3;
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker ICmp2->eraseFromParent();
389*9880d681SAndroid Build Coastguard Worker delete BB0;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker delete ICmp0;
392*9880d681SAndroid Build Coastguard Worker delete ICmp1;
393*9880d681SAndroid Build Coastguard Worker delete PtrVecA;
394*9880d681SAndroid Build Coastguard Worker delete PtrVecB;
395*9880d681SAndroid Build Coastguard Worker }
396*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,FPMathOperator)397*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, FPMathOperator) {
398*9880d681SAndroid Build Coastguard Worker LLVMContext Context;
399*9880d681SAndroid Build Coastguard Worker IRBuilder<> Builder(Context);
400*9880d681SAndroid Build Coastguard Worker MDBuilder MDHelper(Context);
401*9880d681SAndroid Build Coastguard Worker Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
402*9880d681SAndroid Build Coastguard Worker MDNode *MD1 = MDHelper.createFPMath(1.0);
403*9880d681SAndroid Build Coastguard Worker Value *V1 = Builder.CreateFAdd(I, I, "", MD1);
404*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(isa<FPMathOperator>(V1));
405*9880d681SAndroid Build Coastguard Worker FPMathOperator *O1 = cast<FPMathOperator>(V1);
406*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(O1->getFPAccuracy(), 1.0);
407*9880d681SAndroid Build Coastguard Worker delete V1;
408*9880d681SAndroid Build Coastguard Worker delete I;
409*9880d681SAndroid Build Coastguard Worker }
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,isEliminableCastPair)412*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, isEliminableCastPair) {
413*9880d681SAndroid Build Coastguard Worker LLVMContext C;
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker Type* Int16Ty = Type::getInt16Ty(C);
416*9880d681SAndroid Build Coastguard Worker Type* Int32Ty = Type::getInt32Ty(C);
417*9880d681SAndroid Build Coastguard Worker Type* Int64Ty = Type::getInt64Ty(C);
418*9880d681SAndroid Build Coastguard Worker Type* Int64PtrTy = Type::getInt64PtrTy(C);
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker // Source and destination pointers have same size -> bitcast.
421*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
422*9880d681SAndroid Build Coastguard Worker CastInst::IntToPtr,
423*9880d681SAndroid Build Coastguard Worker Int64PtrTy, Int64Ty, Int64PtrTy,
424*9880d681SAndroid Build Coastguard Worker Int32Ty, nullptr, Int32Ty),
425*9880d681SAndroid Build Coastguard Worker CastInst::BitCast);
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker // Source and destination have unknown sizes, but the same address space and
428*9880d681SAndroid Build Coastguard Worker // the intermediate int is the maximum pointer size -> bitcast
429*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
430*9880d681SAndroid Build Coastguard Worker CastInst::IntToPtr,
431*9880d681SAndroid Build Coastguard Worker Int64PtrTy, Int64Ty, Int64PtrTy,
432*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, nullptr),
433*9880d681SAndroid Build Coastguard Worker CastInst::BitCast);
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker // Source and destination have unknown sizes, but the same address space and
436*9880d681SAndroid Build Coastguard Worker // the intermediate int is not the maximum pointer size -> nothing
437*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
438*9880d681SAndroid Build Coastguard Worker CastInst::IntToPtr,
439*9880d681SAndroid Build Coastguard Worker Int64PtrTy, Int32Ty, Int64PtrTy,
440*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, nullptr),
441*9880d681SAndroid Build Coastguard Worker 0U);
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Worker // Middle pointer big enough -> bitcast.
444*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
445*9880d681SAndroid Build Coastguard Worker CastInst::PtrToInt,
446*9880d681SAndroid Build Coastguard Worker Int64Ty, Int64PtrTy, Int64Ty,
447*9880d681SAndroid Build Coastguard Worker nullptr, Int64Ty, nullptr),
448*9880d681SAndroid Build Coastguard Worker CastInst::BitCast);
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Worker // Middle pointer too small -> fail.
451*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
452*9880d681SAndroid Build Coastguard Worker CastInst::PtrToInt,
453*9880d681SAndroid Build Coastguard Worker Int64Ty, Int64PtrTy, Int64Ty,
454*9880d681SAndroid Build Coastguard Worker nullptr, Int32Ty, nullptr),
455*9880d681SAndroid Build Coastguard Worker 0U);
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker // Test that we don't eliminate bitcasts between different address spaces,
458*9880d681SAndroid Build Coastguard Worker // or if we don't have available pointer size information.
459*9880d681SAndroid Build Coastguard Worker DataLayout DL("e-p:32:32:32-p1:16:16:16-p2:64:64:64-i1:8:8-i8:8:8-i16:16:16"
460*9880d681SAndroid Build Coastguard Worker "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64"
461*9880d681SAndroid Build Coastguard Worker "-v128:128:128-a:0:64-s:64:64-f80:128:128-n8:16:32:64-S128");
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker Type* Int64PtrTyAS1 = Type::getInt64PtrTy(C, 1);
464*9880d681SAndroid Build Coastguard Worker Type* Int64PtrTyAS2 = Type::getInt64PtrTy(C, 2);
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker IntegerType *Int16SizePtr = DL.getIntPtrType(C, 1);
467*9880d681SAndroid Build Coastguard Worker IntegerType *Int64SizePtr = DL.getIntPtrType(C, 2);
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Worker // Cannot simplify inttoptr, addrspacecast
470*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
471*9880d681SAndroid Build Coastguard Worker CastInst::AddrSpaceCast,
472*9880d681SAndroid Build Coastguard Worker Int16Ty, Int64PtrTyAS1, Int64PtrTyAS2,
473*9880d681SAndroid Build Coastguard Worker nullptr, Int16SizePtr, Int64SizePtr),
474*9880d681SAndroid Build Coastguard Worker 0U);
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker // Cannot simplify addrspacecast, ptrtoint
477*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::AddrSpaceCast,
478*9880d681SAndroid Build Coastguard Worker CastInst::PtrToInt,
479*9880d681SAndroid Build Coastguard Worker Int64PtrTyAS1, Int64PtrTyAS2, Int16Ty,
480*9880d681SAndroid Build Coastguard Worker Int64SizePtr, Int16SizePtr, nullptr),
481*9880d681SAndroid Build Coastguard Worker 0U);
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker // Pass since the bitcast address spaces are the same
484*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
485*9880d681SAndroid Build Coastguard Worker CastInst::BitCast,
486*9880d681SAndroid Build Coastguard Worker Int16Ty, Int64PtrTyAS1, Int64PtrTyAS1,
487*9880d681SAndroid Build Coastguard Worker nullptr, nullptr, nullptr),
488*9880d681SAndroid Build Coastguard Worker CastInst::IntToPtr);
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker }
491*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,CloneCall)492*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, CloneCall) {
493*9880d681SAndroid Build Coastguard Worker LLVMContext C;
494*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(C);
495*9880d681SAndroid Build Coastguard Worker Type *ArgTys[] = {Int32Ty, Int32Ty, Int32Ty};
496*9880d681SAndroid Build Coastguard Worker Type *FnTy = FunctionType::get(Int32Ty, ArgTys, /*isVarArg=*/false);
497*9880d681SAndroid Build Coastguard Worker Value *Callee = Constant::getNullValue(FnTy->getPointerTo());
498*9880d681SAndroid Build Coastguard Worker Value *Args[] = {
499*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Int32Ty, 1),
500*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Int32Ty, 2),
501*9880d681SAndroid Build Coastguard Worker ConstantInt::get(Int32Ty, 3)
502*9880d681SAndroid Build Coastguard Worker };
503*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Call(CallInst::Create(Callee, Args, "result"));
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker // Test cloning the tail call kind.
506*9880d681SAndroid Build Coastguard Worker CallInst::TailCallKind Kinds[] = {CallInst::TCK_None, CallInst::TCK_Tail,
507*9880d681SAndroid Build Coastguard Worker CallInst::TCK_MustTail};
508*9880d681SAndroid Build Coastguard Worker for (CallInst::TailCallKind TCK : Kinds) {
509*9880d681SAndroid Build Coastguard Worker Call->setTailCallKind(TCK);
510*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
511*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());
512*9880d681SAndroid Build Coastguard Worker }
513*9880d681SAndroid Build Coastguard Worker Call->setTailCallKind(CallInst::TCK_None);
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Worker // Test cloning an attribute.
516*9880d681SAndroid Build Coastguard Worker {
517*9880d681SAndroid Build Coastguard Worker AttrBuilder AB;
518*9880d681SAndroid Build Coastguard Worker AB.addAttribute(Attribute::ReadOnly);
519*9880d681SAndroid Build Coastguard Worker Call->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));
520*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
521*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Clone->onlyReadsMemory());
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker }
524*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,AlterCallBundles)525*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, AlterCallBundles) {
526*9880d681SAndroid Build Coastguard Worker LLVMContext C;
527*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(C);
528*9880d681SAndroid Build Coastguard Worker Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);
529*9880d681SAndroid Build Coastguard Worker Value *Callee = Constant::getNullValue(FnTy->getPointerTo());
530*9880d681SAndroid Build Coastguard Worker Value *Args[] = {ConstantInt::get(Int32Ty, 42)};
531*9880d681SAndroid Build Coastguard Worker OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));
532*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Call(
533*9880d681SAndroid Build Coastguard Worker CallInst::Create(Callee, Args, OldBundle, "result"));
534*9880d681SAndroid Build Coastguard Worker Call->setTailCallKind(CallInst::TailCallKind::TCK_NoTail);
535*9880d681SAndroid Build Coastguard Worker AttrBuilder AB;
536*9880d681SAndroid Build Coastguard Worker AB.addAttribute(Attribute::Cold);
537*9880d681SAndroid Build Coastguard Worker Call->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));
538*9880d681SAndroid Build Coastguard Worker Call->setDebugLoc(DebugLoc(MDNode::get(C, None)));
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
541*9880d681SAndroid Build Coastguard Worker std::unique_ptr<CallInst> Clone(CallInst::Create(Call.get(), NewBundle));
542*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getNumArgOperands(), Clone->getNumArgOperands());
543*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getArgOperand(0), Clone->getArgOperand(0));
544*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getCallingConv(), Clone->getCallingConv());
545*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());
546*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));
547*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Call->getDebugLoc(), Clone->getDebugLoc());
548*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Clone->getNumOperandBundles(), 1U);
549*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Clone->getOperandBundle("after").hasValue());
550*9880d681SAndroid Build Coastguard Worker }
551*9880d681SAndroid Build Coastguard Worker
TEST(InstructionsTest,AlterInvokeBundles)552*9880d681SAndroid Build Coastguard Worker TEST(InstructionsTest, AlterInvokeBundles) {
553*9880d681SAndroid Build Coastguard Worker LLVMContext C;
554*9880d681SAndroid Build Coastguard Worker Type *Int32Ty = Type::getInt32Ty(C);
555*9880d681SAndroid Build Coastguard Worker Type *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);
556*9880d681SAndroid Build Coastguard Worker Value *Callee = Constant::getNullValue(FnTy->getPointerTo());
557*9880d681SAndroid Build Coastguard Worker Value *Args[] = {ConstantInt::get(Int32Ty, 42)};
558*9880d681SAndroid Build Coastguard Worker std::unique_ptr<BasicBlock> NormalDest(BasicBlock::Create(C));
559*9880d681SAndroid Build Coastguard Worker std::unique_ptr<BasicBlock> UnwindDest(BasicBlock::Create(C));
560*9880d681SAndroid Build Coastguard Worker OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));
561*9880d681SAndroid Build Coastguard Worker std::unique_ptr<InvokeInst> Invoke(InvokeInst::Create(
562*9880d681SAndroid Build Coastguard Worker Callee, NormalDest.get(), UnwindDest.get(), Args, OldBundle, "result"));
563*9880d681SAndroid Build Coastguard Worker AttrBuilder AB;
564*9880d681SAndroid Build Coastguard Worker AB.addAttribute(Attribute::Cold);
565*9880d681SAndroid Build Coastguard Worker Invoke->setAttributes(AttributeSet::get(C, AttributeSet::FunctionIndex, AB));
566*9880d681SAndroid Build Coastguard Worker Invoke->setDebugLoc(DebugLoc(MDNode::get(C, None)));
567*9880d681SAndroid Build Coastguard Worker
568*9880d681SAndroid Build Coastguard Worker OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
569*9880d681SAndroid Build Coastguard Worker std::unique_ptr<InvokeInst> Clone(
570*9880d681SAndroid Build Coastguard Worker InvokeInst::Create(Invoke.get(), NewBundle));
571*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getNormalDest(), Clone->getNormalDest());
572*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getUnwindDest(), Clone->getUnwindDest());
573*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getNumArgOperands(), Clone->getNumArgOperands());
574*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getArgOperand(0), Clone->getArgOperand(0));
575*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getCallingConv(), Clone->getCallingConv());
576*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));
577*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Invoke->getDebugLoc(), Clone->getDebugLoc());
578*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Clone->getNumOperandBundles(), 1U);
579*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Clone->getOperandBundle("after").hasValue());
580*9880d681SAndroid Build Coastguard Worker }
581*9880d681SAndroid Build Coastguard Worker
582*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
583*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
584