xref: /llvm-project/llvm/unittests/IR/InstructionsTest.cpp (revision 51a895aded890e90493be59f7af0fa5a3b9b85aa)
1 //===- llvm/unittest/IR/InstructionsTest.cpp - Instructions unit tests ----===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/IR/Instructions.h"
10 #include "llvm/ADT/CombinationGenerator.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/Analysis/ValueTracking.h"
13 #include "llvm/Analysis/VectorUtils.h"
14 #include "llvm/AsmParser/Parser.h"
15 #include "llvm/IR/BasicBlock.h"
16 #include "llvm/IR/Constants.h"
17 #include "llvm/IR/DataLayout.h"
18 #include "llvm/IR/DebugInfoMetadata.h"
19 #include "llvm/IR/DerivedTypes.h"
20 #include "llvm/IR/FPEnv.h"
21 #include "llvm/IR/Function.h"
22 #include "llvm/IR/IRBuilder.h"
23 #include "llvm/IR/LLVMContext.h"
24 #include "llvm/IR/MDBuilder.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/IR/NoFolder.h"
27 #include "llvm/IR/Operator.h"
28 #include "llvm/Support/CommandLine.h"
29 #include "llvm/Support/SourceMgr.h"
30 #include "llvm-c/Core.h"
31 #include "gmock/gmock-matchers.h"
32 #include "gtest/gtest.h"
33 #include <memory>
34 
35 extern llvm::cl::opt<bool> UseNewDbgInfoFormat;
36 
37 namespace llvm {
38 namespace {
39 
40 static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) {
41   SMDiagnostic Err;
42   std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C);
43   if (!Mod)
44     Err.print("InstructionsTests", errs());
45   return Mod;
46 }
47 
48 TEST(InstructionsTest, ReturnInst) {
49   LLVMContext C;
50 
51   // test for PR6589
52   const ReturnInst* r0 = ReturnInst::Create(C);
53   EXPECT_EQ(r0->getNumOperands(), 0U);
54   EXPECT_EQ(r0->op_begin(), r0->op_end());
55 
56   IntegerType* Int1 = IntegerType::get(C, 1);
57   Constant* One = ConstantInt::get(Int1, 1, true);
58   const ReturnInst* r1 = ReturnInst::Create(C, One);
59   EXPECT_EQ(1U, r1->getNumOperands());
60   User::const_op_iterator b(r1->op_begin());
61   EXPECT_NE(r1->op_end(), b);
62   EXPECT_EQ(One, *b);
63   EXPECT_EQ(One, r1->getOperand(0));
64   ++b;
65   EXPECT_EQ(r1->op_end(), b);
66 
67   // clean up
68   delete r0;
69   delete r1;
70 }
71 
72 // Test fixture that provides a module and a single function within it. Useful
73 // for tests that need to refer to the function in some way.
74 class ModuleWithFunctionTest : public testing::Test {
75 protected:
76   ModuleWithFunctionTest() : M(new Module("MyModule", Ctx)) {
77     FArgTypes.push_back(Type::getInt8Ty(Ctx));
78     FArgTypes.push_back(Type::getInt32Ty(Ctx));
79     FArgTypes.push_back(Type::getInt64Ty(Ctx));
80     FunctionType *FTy =
81         FunctionType::get(Type::getVoidTy(Ctx), FArgTypes, false);
82     F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
83   }
84 
85   LLVMContext Ctx;
86   std::unique_ptr<Module> M;
87   SmallVector<Type *, 3> FArgTypes;
88   Function *F;
89 };
90 
91 TEST_F(ModuleWithFunctionTest, CallInst) {
92   Value *Args[] = {ConstantInt::get(Type::getInt8Ty(Ctx), 20),
93                    ConstantInt::get(Type::getInt32Ty(Ctx), 9999),
94                    ConstantInt::get(Type::getInt64Ty(Ctx), 42)};
95   std::unique_ptr<CallInst> Call(CallInst::Create(F, Args));
96 
97   // Make sure iteration over a call's arguments works as expected.
98   unsigned Idx = 0;
99   for (Value *Arg : Call->args()) {
100     EXPECT_EQ(FArgTypes[Idx], Arg->getType());
101     EXPECT_EQ(Call->getArgOperand(Idx)->getType(), Arg->getType());
102     Idx++;
103   }
104 
105   Call->addRetAttr(Attribute::get(Call->getContext(), "test-str-attr"));
106   EXPECT_TRUE(Call->hasRetAttr("test-str-attr"));
107   EXPECT_FALSE(Call->hasRetAttr("not-on-call"));
108 
109   Call->addFnAttr(Attribute::get(Call->getContext(), "test-str-fn-attr"));
110   ASSERT_TRUE(Call->hasFnAttr("test-str-fn-attr"));
111   Call->removeFnAttr("test-str-fn-attr");
112   EXPECT_FALSE(Call->hasFnAttr("test-str-fn-attr"));
113 }
114 
115 TEST_F(ModuleWithFunctionTest, InvokeInst) {
116   BasicBlock *BB1 = BasicBlock::Create(Ctx, "", F);
117   BasicBlock *BB2 = BasicBlock::Create(Ctx, "", F);
118 
119   Value *Args[] = {ConstantInt::get(Type::getInt8Ty(Ctx), 20),
120                    ConstantInt::get(Type::getInt32Ty(Ctx), 9999),
121                    ConstantInt::get(Type::getInt64Ty(Ctx), 42)};
122   std::unique_ptr<InvokeInst> Invoke(InvokeInst::Create(F, BB1, BB2, Args));
123 
124   // Make sure iteration over invoke's arguments works as expected.
125   unsigned Idx = 0;
126   for (Value *Arg : Invoke->args()) {
127     EXPECT_EQ(FArgTypes[Idx], Arg->getType());
128     EXPECT_EQ(Invoke->getArgOperand(Idx)->getType(), Arg->getType());
129     Idx++;
130   }
131 }
132 
133 TEST(InstructionsTest, BranchInst) {
134   LLVMContext C;
135 
136   // Make a BasicBlocks
137   BasicBlock* bb0 = BasicBlock::Create(C);
138   BasicBlock* bb1 = BasicBlock::Create(C);
139 
140   // Mandatory BranchInst
141   const BranchInst* b0 = BranchInst::Create(bb0);
142 
143   EXPECT_TRUE(b0->isUnconditional());
144   EXPECT_FALSE(b0->isConditional());
145   EXPECT_EQ(1U, b0->getNumSuccessors());
146 
147   // check num operands
148   EXPECT_EQ(1U, b0->getNumOperands());
149 
150   EXPECT_NE(b0->op_begin(), b0->op_end());
151   EXPECT_EQ(b0->op_end(), std::next(b0->op_begin()));
152 
153   EXPECT_EQ(b0->op_end(), std::next(b0->op_begin()));
154 
155   IntegerType* Int1 = IntegerType::get(C, 1);
156   Constant* One = ConstantInt::get(Int1, 1, true);
157 
158   // Conditional BranchInst
159   BranchInst* b1 = BranchInst::Create(bb0, bb1, One);
160 
161   EXPECT_FALSE(b1->isUnconditional());
162   EXPECT_TRUE(b1->isConditional());
163   EXPECT_EQ(2U, b1->getNumSuccessors());
164 
165   // check num operands
166   EXPECT_EQ(3U, b1->getNumOperands());
167 
168   User::const_op_iterator b(b1->op_begin());
169 
170   // check COND
171   EXPECT_NE(b, b1->op_end());
172   EXPECT_EQ(One, *b);
173   EXPECT_EQ(One, b1->getOperand(0));
174   EXPECT_EQ(One, b1->getCondition());
175   ++b;
176 
177   // check ELSE
178   EXPECT_EQ(bb1, *b);
179   EXPECT_EQ(bb1, b1->getOperand(1));
180   EXPECT_EQ(bb1, b1->getSuccessor(1));
181   ++b;
182 
183   // check THEN
184   EXPECT_EQ(bb0, *b);
185   EXPECT_EQ(bb0, b1->getOperand(2));
186   EXPECT_EQ(bb0, b1->getSuccessor(0));
187   ++b;
188 
189   EXPECT_EQ(b1->op_end(), b);
190 
191   // clean up
192   delete b0;
193   delete b1;
194 
195   delete bb0;
196   delete bb1;
197 }
198 
199 TEST(InstructionsTest, CastInst) {
200   LLVMContext C;
201 
202   Type *Int8Ty = Type::getInt8Ty(C);
203   Type *Int16Ty = Type::getInt16Ty(C);
204   Type *Int32Ty = Type::getInt32Ty(C);
205   Type *Int64Ty = Type::getInt64Ty(C);
206   Type *V8x8Ty = FixedVectorType::get(Int8Ty, 8);
207   Type *V8x64Ty = FixedVectorType::get(Int64Ty, 8);
208 
209   Type *HalfTy = Type::getHalfTy(C);
210   Type *FloatTy = Type::getFloatTy(C);
211   Type *DoubleTy = Type::getDoubleTy(C);
212 
213   Type *V2Int32Ty = FixedVectorType::get(Int32Ty, 2);
214   Type *V2Int64Ty = FixedVectorType::get(Int64Ty, 2);
215   Type *V4Int16Ty = FixedVectorType::get(Int16Ty, 4);
216   Type *V1Int16Ty = FixedVectorType::get(Int16Ty, 1);
217 
218   Type *VScaleV2Int32Ty = ScalableVectorType::get(Int32Ty, 2);
219   Type *VScaleV2Int64Ty = ScalableVectorType::get(Int64Ty, 2);
220   Type *VScaleV4Int16Ty = ScalableVectorType::get(Int16Ty, 4);
221   Type *VScaleV1Int16Ty = ScalableVectorType::get(Int16Ty, 1);
222 
223   Type *Int32PtrTy = PointerType::get(Int32Ty, 0);
224   Type *Int64PtrTy = PointerType::get(Int64Ty, 0);
225 
226   Type *Int32PtrAS1Ty = PointerType::get(Int32Ty, 1);
227   Type *Int64PtrAS1Ty = PointerType::get(Int64Ty, 1);
228 
229   Type *V2Int32PtrAS1Ty = FixedVectorType::get(Int32PtrAS1Ty, 2);
230   Type *V2Int64PtrAS1Ty = FixedVectorType::get(Int64PtrAS1Ty, 2);
231   Type *V4Int32PtrAS1Ty = FixedVectorType::get(Int32PtrAS1Ty, 4);
232   Type *VScaleV4Int32PtrAS1Ty = ScalableVectorType::get(Int32PtrAS1Ty, 4);
233   Type *V4Int64PtrAS1Ty = FixedVectorType::get(Int64PtrAS1Ty, 4);
234 
235   Type *V2Int64PtrTy = FixedVectorType::get(Int64PtrTy, 2);
236   Type *V2Int32PtrTy = FixedVectorType::get(Int32PtrTy, 2);
237   Type *VScaleV2Int32PtrTy = ScalableVectorType::get(Int32PtrTy, 2);
238   Type *V4Int32PtrTy = FixedVectorType::get(Int32PtrTy, 4);
239   Type *VScaleV4Int32PtrTy = ScalableVectorType::get(Int32PtrTy, 4);
240   Type *VScaleV4Int64PtrTy = ScalableVectorType::get(Int64PtrTy, 4);
241 
242   const Constant* c8 = Constant::getNullValue(V8x8Ty);
243   const Constant* c64 = Constant::getNullValue(V8x64Ty);
244 
245   const Constant *v2ptr32 = Constant::getNullValue(V2Int32PtrTy);
246 
247   EXPECT_EQ(CastInst::Trunc, CastInst::getCastOpcode(c64, true, V8x8Ty, true));
248   EXPECT_EQ(CastInst::SExt, CastInst::getCastOpcode(c8, true, V8x64Ty, true));
249 
250   EXPECT_FALSE(CastInst::isBitCastable(V8x64Ty, V8x8Ty));
251   EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty, V8x64Ty));
252 
253   // Check address space casts are rejected since we don't know the sizes here
254   EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, Int32PtrAS1Ty));
255   EXPECT_FALSE(CastInst::isBitCastable(Int32PtrAS1Ty, Int32PtrTy));
256   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, V2Int32PtrAS1Ty));
257   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int32PtrTy));
258   EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int64PtrAS1Ty));
259   EXPECT_EQ(CastInst::AddrSpaceCast, CastInst::getCastOpcode(v2ptr32, true,
260                                                              V2Int32PtrAS1Ty,
261                                                              true));
262 
263   // Test mismatched number of elements for pointers
264   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int64PtrAS1Ty));
265   EXPECT_FALSE(CastInst::isBitCastable(V4Int64PtrAS1Ty, V2Int32PtrAS1Ty));
266   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int32PtrAS1Ty));
267   EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, V2Int32PtrTy));
268   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int32PtrTy));
269 
270   EXPECT_TRUE(CastInst::isBitCastable(Int32PtrTy, Int64PtrTy));
271   EXPECT_FALSE(CastInst::isBitCastable(DoubleTy, FloatTy));
272   EXPECT_FALSE(CastInst::isBitCastable(FloatTy, DoubleTy));
273   EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy));
274   EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy));
275   EXPECT_TRUE(CastInst::isBitCastable(FloatTy, Int32Ty));
276   EXPECT_TRUE(CastInst::isBitCastable(Int16Ty, HalfTy));
277   EXPECT_TRUE(CastInst::isBitCastable(Int32Ty, FloatTy));
278   EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, Int64Ty));
279 
280   EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, V4Int16Ty));
281   EXPECT_FALSE(CastInst::isBitCastable(Int32Ty, Int64Ty));
282   EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, Int32Ty));
283 
284   EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int64Ty));
285   EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, V2Int32PtrTy));
286   EXPECT_TRUE(CastInst::isBitCastable(V2Int64PtrTy, V2Int32PtrTy));
287   EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrTy, V2Int64PtrTy));
288   EXPECT_FALSE(CastInst::isBitCastable(V2Int32Ty, V2Int64Ty));
289   EXPECT_FALSE(CastInst::isBitCastable(V2Int64Ty, V2Int32Ty));
290 
291 
292   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
293                                      Constant::getNullValue(V4Int32PtrTy),
294                                      V2Int32PtrTy));
295   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
296                                      Constant::getNullValue(V2Int32PtrTy),
297                                      V4Int32PtrTy));
298 
299   EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
300                                      Constant::getNullValue(V4Int32PtrAS1Ty),
301                                      V2Int32PtrTy));
302   EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
303                                      Constant::getNullValue(V2Int32PtrTy),
304                                      V4Int32PtrAS1Ty));
305 
306   // Address space cast of fixed/scalable vectors of pointers to scalable/fixed
307   // vector of pointers.
308   EXPECT_FALSE(CastInst::castIsValid(
309       Instruction::AddrSpaceCast, Constant::getNullValue(VScaleV4Int32PtrAS1Ty),
310       V4Int32PtrTy));
311   EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
312                                      Constant::getNullValue(V4Int32PtrTy),
313                                      VScaleV4Int32PtrAS1Ty));
314   // Address space cast of scalable vectors of pointers to scalable vector of
315   // pointers.
316   EXPECT_FALSE(CastInst::castIsValid(
317       Instruction::AddrSpaceCast, Constant::getNullValue(VScaleV4Int32PtrAS1Ty),
318       VScaleV2Int32PtrTy));
319   EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
320                                      Constant::getNullValue(VScaleV2Int32PtrTy),
321                                      VScaleV4Int32PtrAS1Ty));
322   EXPECT_TRUE(CastInst::castIsValid(Instruction::AddrSpaceCast,
323                                     Constant::getNullValue(VScaleV4Int64PtrTy),
324                                     VScaleV4Int32PtrAS1Ty));
325   // Same number of lanes, different address space.
326   EXPECT_TRUE(CastInst::castIsValid(
327       Instruction::AddrSpaceCast, Constant::getNullValue(VScaleV4Int32PtrAS1Ty),
328       VScaleV4Int32PtrTy));
329   // Same number of lanes, same address space.
330   EXPECT_FALSE(CastInst::castIsValid(Instruction::AddrSpaceCast,
331                                      Constant::getNullValue(VScaleV4Int64PtrTy),
332                                      VScaleV4Int32PtrTy));
333 
334   // Bit casting fixed/scalable vector to scalable/fixed vectors.
335   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
336                                      Constant::getNullValue(V2Int32Ty),
337                                      VScaleV2Int32Ty));
338   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
339                                      Constant::getNullValue(V2Int64Ty),
340                                      VScaleV2Int64Ty));
341   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
342                                      Constant::getNullValue(V4Int16Ty),
343                                      VScaleV4Int16Ty));
344   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
345                                      Constant::getNullValue(VScaleV2Int32Ty),
346                                      V2Int32Ty));
347   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
348                                      Constant::getNullValue(VScaleV2Int64Ty),
349                                      V2Int64Ty));
350   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
351                                      Constant::getNullValue(VScaleV4Int16Ty),
352                                      V4Int16Ty));
353 
354   // Bit casting scalable vectors to scalable vectors.
355   EXPECT_TRUE(CastInst::castIsValid(Instruction::BitCast,
356                                     Constant::getNullValue(VScaleV4Int16Ty),
357                                     VScaleV2Int32Ty));
358   EXPECT_TRUE(CastInst::castIsValid(Instruction::BitCast,
359                                     Constant::getNullValue(VScaleV2Int32Ty),
360                                     VScaleV4Int16Ty));
361   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
362                                      Constant::getNullValue(VScaleV2Int64Ty),
363                                      VScaleV2Int32Ty));
364   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
365                                      Constant::getNullValue(VScaleV2Int32Ty),
366                                      VScaleV2Int64Ty));
367 
368   // Bitcasting to/from <vscale x 1 x Ty>
369   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
370                                      Constant::getNullValue(VScaleV1Int16Ty),
371                                      V1Int16Ty));
372   EXPECT_FALSE(CastInst::castIsValid(Instruction::BitCast,
373                                      Constant::getNullValue(V1Int16Ty),
374                                      VScaleV1Int16Ty));
375 
376   // Check that assertion is not hit when creating a cast with a vector of
377   // pointers
378   // First form
379   BasicBlock *BB = BasicBlock::Create(C);
380   Constant *NullV2I32Ptr = Constant::getNullValue(V2Int32PtrTy);
381   auto Inst1 = CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty, "foo", BB);
382 
383   Constant *NullVScaleV2I32Ptr = Constant::getNullValue(VScaleV2Int32PtrTy);
384   auto Inst1VScale = CastInst::CreatePointerCast(
385       NullVScaleV2I32Ptr, VScaleV2Int32Ty, "foo.vscale", BB);
386 
387   // Second form
388   auto Inst2 = CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty);
389   auto Inst2VScale =
390       CastInst::CreatePointerCast(NullVScaleV2I32Ptr, VScaleV2Int32Ty);
391 
392   delete Inst2;
393   delete Inst2VScale;
394   Inst1->eraseFromParent();
395   Inst1VScale->eraseFromParent();
396   delete BB;
397 }
398 
399 TEST(InstructionsTest, CastCAPI) {
400   LLVMContext C;
401 
402   Type *Int8Ty = Type::getInt8Ty(C);
403   Type *Int32Ty = Type::getInt32Ty(C);
404   Type *Int64Ty = Type::getInt64Ty(C);
405 
406   Type *FloatTy = Type::getFloatTy(C);
407   Type *DoubleTy = Type::getDoubleTy(C);
408 
409   Type *Int8PtrTy = PointerType::get(Int8Ty, 0);
410   Type *Int32PtrTy = PointerType::get(Int32Ty, 0);
411 
412   const Constant *C8 = Constant::getNullValue(Int8Ty);
413   const Constant *C64 = Constant::getNullValue(Int64Ty);
414 
415   EXPECT_EQ(LLVMBitCast,
416             LLVMGetCastOpcode(wrap(C64), true, wrap(Int64Ty), true));
417   EXPECT_EQ(LLVMTrunc, LLVMGetCastOpcode(wrap(C64), true, wrap(Int8Ty), true));
418   EXPECT_EQ(LLVMSExt, LLVMGetCastOpcode(wrap(C8), true, wrap(Int64Ty), true));
419   EXPECT_EQ(LLVMZExt, LLVMGetCastOpcode(wrap(C8), false, wrap(Int64Ty), true));
420 
421   const Constant *CF32 = Constant::getNullValue(FloatTy);
422   const Constant *CF64 = Constant::getNullValue(DoubleTy);
423 
424   EXPECT_EQ(LLVMFPToUI,
425             LLVMGetCastOpcode(wrap(CF32), true, wrap(Int8Ty), false));
426   EXPECT_EQ(LLVMFPToSI,
427             LLVMGetCastOpcode(wrap(CF32), true, wrap(Int8Ty), true));
428   EXPECT_EQ(LLVMUIToFP,
429             LLVMGetCastOpcode(wrap(C8), false, wrap(FloatTy), true));
430   EXPECT_EQ(LLVMSIToFP, LLVMGetCastOpcode(wrap(C8), true, wrap(FloatTy), true));
431   EXPECT_EQ(LLVMFPTrunc,
432             LLVMGetCastOpcode(wrap(CF64), true, wrap(FloatTy), true));
433   EXPECT_EQ(LLVMFPExt,
434             LLVMGetCastOpcode(wrap(CF32), true, wrap(DoubleTy), true));
435 
436   const Constant *CPtr8 = Constant::getNullValue(Int8PtrTy);
437 
438   EXPECT_EQ(LLVMPtrToInt,
439             LLVMGetCastOpcode(wrap(CPtr8), true, wrap(Int8Ty), true));
440   EXPECT_EQ(LLVMIntToPtr,
441             LLVMGetCastOpcode(wrap(C8), true, wrap(Int8PtrTy), true));
442 
443   Type *V8x8Ty = FixedVectorType::get(Int8Ty, 8);
444   Type *V8x64Ty = FixedVectorType::get(Int64Ty, 8);
445   const Constant *CV8 = Constant::getNullValue(V8x8Ty);
446   const Constant *CV64 = Constant::getNullValue(V8x64Ty);
447 
448   EXPECT_EQ(LLVMTrunc, LLVMGetCastOpcode(wrap(CV64), true, wrap(V8x8Ty), true));
449   EXPECT_EQ(LLVMSExt, LLVMGetCastOpcode(wrap(CV8), true, wrap(V8x64Ty), true));
450 
451   Type *Int32PtrAS1Ty = PointerType::get(Int32Ty, 1);
452   Type *V2Int32PtrAS1Ty = FixedVectorType::get(Int32PtrAS1Ty, 2);
453   Type *V2Int32PtrTy = FixedVectorType::get(Int32PtrTy, 2);
454   const Constant *CV2ptr32 = Constant::getNullValue(V2Int32PtrTy);
455 
456   EXPECT_EQ(LLVMAddrSpaceCast, LLVMGetCastOpcode(wrap(CV2ptr32), true,
457                                                  wrap(V2Int32PtrAS1Ty), true));
458 }
459 
460 TEST(InstructionsTest, VectorGep) {
461   LLVMContext C;
462 
463   // Type Definitions
464   Type *I8Ty = IntegerType::get(C, 8);
465   Type *I32Ty = IntegerType::get(C, 32);
466   PointerType *Ptri8Ty = PointerType::get(I8Ty, 0);
467   PointerType *Ptri32Ty = PointerType::get(I32Ty, 0);
468 
469   VectorType *V2xi8PTy = FixedVectorType::get(Ptri8Ty, 2);
470   VectorType *V2xi32PTy = FixedVectorType::get(Ptri32Ty, 2);
471 
472   // Test different aspects of the vector-of-pointers type
473   // and GEPs which use this type.
474   ConstantInt *Ci32a = ConstantInt::get(C, APInt(32, 1492));
475   ConstantInt *Ci32b = ConstantInt::get(C, APInt(32, 1948));
476   std::vector<Constant*> ConstVa(2, Ci32a);
477   std::vector<Constant*> ConstVb(2, Ci32b);
478   Constant *C2xi32a = ConstantVector::get(ConstVa);
479   Constant *C2xi32b = ConstantVector::get(ConstVb);
480 
481   CastInst *PtrVecA = new IntToPtrInst(C2xi32a, V2xi32PTy);
482   CastInst *PtrVecB = new IntToPtrInst(C2xi32b, V2xi32PTy);
483 
484   ICmpInst *ICmp0 = new ICmpInst(ICmpInst::ICMP_SGT, PtrVecA, PtrVecB);
485   ICmpInst *ICmp1 = new ICmpInst(ICmpInst::ICMP_ULT, PtrVecA, PtrVecB);
486   EXPECT_NE(ICmp0, ICmp1); // suppress warning.
487 
488   BasicBlock* BB0 = BasicBlock::Create(C);
489   // Test InsertAtEnd ICmpInst constructor.
490   ICmpInst *ICmp2 = new ICmpInst(BB0, ICmpInst::ICMP_SGE, PtrVecA, PtrVecB);
491   EXPECT_NE(ICmp0, ICmp2); // suppress warning.
492 
493   GetElementPtrInst *Gep0 = GetElementPtrInst::Create(I32Ty, PtrVecA, C2xi32a);
494   GetElementPtrInst *Gep1 = GetElementPtrInst::Create(I32Ty, PtrVecA, C2xi32b);
495   GetElementPtrInst *Gep2 = GetElementPtrInst::Create(I32Ty, PtrVecB, C2xi32a);
496   GetElementPtrInst *Gep3 = GetElementPtrInst::Create(I32Ty, PtrVecB, C2xi32b);
497 
498   CastInst *BTC0 = new BitCastInst(Gep0, V2xi8PTy);
499   CastInst *BTC1 = new BitCastInst(Gep1, V2xi8PTy);
500   CastInst *BTC2 = new BitCastInst(Gep2, V2xi8PTy);
501   CastInst *BTC3 = new BitCastInst(Gep3, V2xi8PTy);
502 
503   Value *S0 = BTC0->stripPointerCasts();
504   Value *S1 = BTC1->stripPointerCasts();
505   Value *S2 = BTC2->stripPointerCasts();
506   Value *S3 = BTC3->stripPointerCasts();
507 
508   EXPECT_NE(S0, Gep0);
509   EXPECT_NE(S1, Gep1);
510   EXPECT_NE(S2, Gep2);
511   EXPECT_NE(S3, Gep3);
512 
513   int64_t Offset;
514   DataLayout TD("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3"
515                 "2:32:32-f64:64:64-v64:64:64-v128:128:128-a:0:64-s:64:64-f80"
516                 ":128:128-n8:16:32:64-S128");
517   // Make sure we don't crash
518   GetPointerBaseWithConstantOffset(Gep0, Offset, TD);
519   GetPointerBaseWithConstantOffset(Gep1, Offset, TD);
520   GetPointerBaseWithConstantOffset(Gep2, Offset, TD);
521   GetPointerBaseWithConstantOffset(Gep3, Offset, TD);
522 
523   // Gep of Geps
524   GetElementPtrInst *GepII0 = GetElementPtrInst::Create(I32Ty, Gep0, C2xi32b);
525   GetElementPtrInst *GepII1 = GetElementPtrInst::Create(I32Ty, Gep1, C2xi32a);
526   GetElementPtrInst *GepII2 = GetElementPtrInst::Create(I32Ty, Gep2, C2xi32b);
527   GetElementPtrInst *GepII3 = GetElementPtrInst::Create(I32Ty, Gep3, C2xi32a);
528 
529   EXPECT_EQ(GepII0->getNumIndices(), 1u);
530   EXPECT_EQ(GepII1->getNumIndices(), 1u);
531   EXPECT_EQ(GepII2->getNumIndices(), 1u);
532   EXPECT_EQ(GepII3->getNumIndices(), 1u);
533 
534   EXPECT_FALSE(GepII0->hasAllZeroIndices());
535   EXPECT_FALSE(GepII1->hasAllZeroIndices());
536   EXPECT_FALSE(GepII2->hasAllZeroIndices());
537   EXPECT_FALSE(GepII3->hasAllZeroIndices());
538 
539   delete GepII0;
540   delete GepII1;
541   delete GepII2;
542   delete GepII3;
543 
544   delete BTC0;
545   delete BTC1;
546   delete BTC2;
547   delete BTC3;
548 
549   delete Gep0;
550   delete Gep1;
551   delete Gep2;
552   delete Gep3;
553 
554   ICmp2->eraseFromParent();
555   delete BB0;
556 
557   delete ICmp0;
558   delete ICmp1;
559   delete PtrVecA;
560   delete PtrVecB;
561 }
562 
563 TEST(InstructionsTest, FPMathOperator) {
564   LLVMContext Context;
565   IRBuilder<> Builder(Context);
566   MDBuilder MDHelper(Context);
567   Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
568   MDNode *MD1 = MDHelper.createFPMath(1.0);
569   Value *V1 = Builder.CreateFAdd(I, I, "", MD1);
570   EXPECT_TRUE(isa<FPMathOperator>(V1));
571   FPMathOperator *O1 = cast<FPMathOperator>(V1);
572   EXPECT_EQ(O1->getFPAccuracy(), 1.0);
573   V1->deleteValue();
574   I->deleteValue();
575 }
576 
577 TEST(InstructionTest, ConstrainedTrans) {
578   LLVMContext Context;
579   std::unique_ptr<Module> M(new Module("MyModule", Context));
580   FunctionType *FTy =
581       FunctionType::get(Type::getVoidTy(Context),
582                         {Type::getFloatTy(Context), Type::getFloatTy(Context),
583                          Type::getInt32Ty(Context)},
584                         false);
585   auto *F = Function::Create(FTy, Function::ExternalLinkage, "", M.get());
586   auto *BB = BasicBlock::Create(Context, "bb", F);
587   IRBuilder<> Builder(Context);
588   Builder.SetInsertPoint(BB);
589   auto *Arg0 = F->arg_begin();
590   auto *Arg1 = F->arg_begin() + 1;
591 
592   {
593     auto *I = cast<Instruction>(Builder.CreateFAdd(Arg0, Arg1));
594     EXPECT_EQ(Intrinsic::experimental_constrained_fadd,
595               getConstrainedIntrinsicID(*I));
596   }
597 
598   {
599     auto *I = cast<Instruction>(
600         Builder.CreateFPToSI(Arg0, Type::getInt32Ty(Context)));
601     EXPECT_EQ(Intrinsic::experimental_constrained_fptosi,
602               getConstrainedIntrinsicID(*I));
603   }
604 
605   {
606     auto *I = cast<Instruction>(Builder.CreateIntrinsic(
607         Intrinsic::ceil, {Type::getFloatTy(Context)}, {Arg0}));
608     EXPECT_EQ(Intrinsic::experimental_constrained_ceil,
609               getConstrainedIntrinsicID(*I));
610   }
611 
612   {
613     auto *I = cast<Instruction>(Builder.CreateFCmpOEQ(Arg0, Arg1));
614     EXPECT_EQ(Intrinsic::experimental_constrained_fcmp,
615               getConstrainedIntrinsicID(*I));
616   }
617 
618   {
619     auto *Arg2 = F->arg_begin() + 2;
620     auto *I = cast<Instruction>(Builder.CreateAdd(Arg2, Arg2));
621     EXPECT_EQ(Intrinsic::not_intrinsic, getConstrainedIntrinsicID(*I));
622   }
623 
624   {
625     auto *I = cast<Instruction>(Builder.CreateConstrainedFPBinOp(
626         Intrinsic::experimental_constrained_fadd, Arg0, Arg0));
627     EXPECT_EQ(Intrinsic::not_intrinsic, getConstrainedIntrinsicID(*I));
628   }
629 }
630 
631 TEST(InstructionsTest, isEliminableCastPair) {
632   LLVMContext C;
633 
634   Type* Int16Ty = Type::getInt16Ty(C);
635   Type* Int32Ty = Type::getInt32Ty(C);
636   Type* Int64Ty = Type::getInt64Ty(C);
637   Type *Int64PtrTy = PointerType::get(C, 0);
638 
639   // Source and destination pointers have same size -> bitcast.
640   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
641                                            CastInst::IntToPtr,
642                                            Int64PtrTy, Int64Ty, Int64PtrTy,
643                                            Int32Ty, nullptr, Int32Ty),
644             CastInst::BitCast);
645 
646   // Source and destination have unknown sizes, but the same address space and
647   // the intermediate int is the maximum pointer size -> bitcast
648   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
649                                            CastInst::IntToPtr,
650                                            Int64PtrTy, Int64Ty, Int64PtrTy,
651                                            nullptr, nullptr, nullptr),
652             CastInst::BitCast);
653 
654   // Source and destination have unknown sizes, but the same address space and
655   // the intermediate int is not the maximum pointer size -> nothing
656   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
657                                            CastInst::IntToPtr,
658                                            Int64PtrTy, Int32Ty, Int64PtrTy,
659                                            nullptr, nullptr, nullptr),
660             0U);
661 
662   // Middle pointer big enough -> bitcast.
663   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
664                                            CastInst::PtrToInt,
665                                            Int64Ty, Int64PtrTy, Int64Ty,
666                                            nullptr, Int64Ty, nullptr),
667             CastInst::BitCast);
668 
669   // Middle pointer too small -> fail.
670   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
671                                            CastInst::PtrToInt,
672                                            Int64Ty, Int64PtrTy, Int64Ty,
673                                            nullptr, Int32Ty, nullptr),
674             0U);
675 
676   // Test that we don't eliminate bitcasts between different address spaces,
677   // or if we don't have available pointer size information.
678   DataLayout DL("e-p:32:32:32-p1:16:16:16-p2:64:64:64-i1:8:8-i8:8:8-i16:16:16"
679                 "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64"
680                 "-v128:128:128-a:0:64-s:64:64-f80:128:128-n8:16:32:64-S128");
681 
682   Type *Int64PtrTyAS1 = PointerType::get(C, 1);
683   Type *Int64PtrTyAS2 = PointerType::get(C, 2);
684 
685   IntegerType *Int16SizePtr = DL.getIntPtrType(C, 1);
686   IntegerType *Int64SizePtr = DL.getIntPtrType(C, 2);
687 
688   // Cannot simplify inttoptr, addrspacecast
689   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
690                                            CastInst::AddrSpaceCast,
691                                            Int16Ty, Int64PtrTyAS1, Int64PtrTyAS2,
692                                            nullptr, Int16SizePtr, Int64SizePtr),
693             0U);
694 
695   // Cannot simplify addrspacecast, ptrtoint
696   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::AddrSpaceCast,
697                                            CastInst::PtrToInt,
698                                            Int64PtrTyAS1, Int64PtrTyAS2, Int16Ty,
699                                            Int64SizePtr, Int16SizePtr, nullptr),
700             0U);
701 
702   // Pass since the bitcast address spaces are the same
703   EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
704                                            CastInst::BitCast,
705                                            Int16Ty, Int64PtrTyAS1, Int64PtrTyAS1,
706                                            nullptr, nullptr, nullptr),
707             CastInst::IntToPtr);
708 
709 }
710 
711 TEST(InstructionsTest, CloneCall) {
712   LLVMContext C;
713   Type *Int32Ty = Type::getInt32Ty(C);
714   Type *ArgTys[] = {Int32Ty, Int32Ty, Int32Ty};
715   FunctionType *FnTy = FunctionType::get(Int32Ty, ArgTys, /*isVarArg=*/false);
716   Value *Callee = Constant::getNullValue(PointerType::getUnqual(C));
717   Value *Args[] = {
718     ConstantInt::get(Int32Ty, 1),
719     ConstantInt::get(Int32Ty, 2),
720     ConstantInt::get(Int32Ty, 3)
721   };
722   std::unique_ptr<CallInst> Call(
723       CallInst::Create(FnTy, Callee, Args, "result"));
724 
725   // Test cloning the tail call kind.
726   CallInst::TailCallKind Kinds[] = {CallInst::TCK_None, CallInst::TCK_Tail,
727                                     CallInst::TCK_MustTail};
728   for (CallInst::TailCallKind TCK : Kinds) {
729     Call->setTailCallKind(TCK);
730     std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
731     EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());
732   }
733   Call->setTailCallKind(CallInst::TCK_None);
734 
735   // Test cloning an attribute.
736   {
737     AttrBuilder AB(C);
738     AB.addAttribute(Attribute::NoUnwind);
739     Call->setAttributes(
740         AttributeList::get(C, AttributeList::FunctionIndex, AB));
741     std::unique_ptr<CallInst> Clone(cast<CallInst>(Call->clone()));
742     EXPECT_TRUE(Clone->doesNotThrow());
743   }
744 }
745 
746 TEST(InstructionsTest, AlterCallBundles) {
747   LLVMContext C;
748   Type *Int32Ty = Type::getInt32Ty(C);
749   FunctionType *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);
750   Value *Callee = Constant::getNullValue(PointerType::getUnqual(C));
751   Value *Args[] = {ConstantInt::get(Int32Ty, 42)};
752   OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));
753   std::unique_ptr<CallInst> Call(
754       CallInst::Create(FnTy, Callee, Args, OldBundle, "result"));
755   Call->setTailCallKind(CallInst::TailCallKind::TCK_NoTail);
756   AttrBuilder AB(C);
757   AB.addAttribute(Attribute::Cold);
758   Call->setAttributes(AttributeList::get(C, AttributeList::FunctionIndex, AB));
759   Call->setDebugLoc(DebugLoc(MDNode::get(C, {})));
760 
761   OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
762   std::unique_ptr<CallInst> Clone(CallInst::Create(Call.get(), NewBundle));
763   EXPECT_EQ(Call->arg_size(), Clone->arg_size());
764   EXPECT_EQ(Call->getArgOperand(0), Clone->getArgOperand(0));
765   EXPECT_EQ(Call->getCallingConv(), Clone->getCallingConv());
766   EXPECT_EQ(Call->getTailCallKind(), Clone->getTailCallKind());
767   EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));
768   EXPECT_EQ(Call->getDebugLoc(), Clone->getDebugLoc());
769   EXPECT_EQ(Clone->getNumOperandBundles(), 1U);
770   EXPECT_TRUE(Clone->getOperandBundle("after"));
771 }
772 
773 TEST(InstructionsTest, AlterInvokeBundles) {
774   LLVMContext C;
775   Type *Int32Ty = Type::getInt32Ty(C);
776   FunctionType *FnTy = FunctionType::get(Int32Ty, Int32Ty, /*isVarArg=*/false);
777   Value *Callee = Constant::getNullValue(PointerType::getUnqual(C));
778   Value *Args[] = {ConstantInt::get(Int32Ty, 42)};
779   std::unique_ptr<BasicBlock> NormalDest(BasicBlock::Create(C));
780   std::unique_ptr<BasicBlock> UnwindDest(BasicBlock::Create(C));
781   OperandBundleDef OldBundle("before", UndefValue::get(Int32Ty));
782   std::unique_ptr<InvokeInst> Invoke(
783       InvokeInst::Create(FnTy, Callee, NormalDest.get(), UnwindDest.get(), Args,
784                          OldBundle, "result"));
785   AttrBuilder AB(C);
786   AB.addAttribute(Attribute::Cold);
787   Invoke->setAttributes(
788       AttributeList::get(C, AttributeList::FunctionIndex, AB));
789   Invoke->setDebugLoc(DebugLoc(MDNode::get(C, {})));
790 
791   OperandBundleDef NewBundle("after", ConstantInt::get(Int32Ty, 7));
792   std::unique_ptr<InvokeInst> Clone(
793       InvokeInst::Create(Invoke.get(), NewBundle));
794   EXPECT_EQ(Invoke->getNormalDest(), Clone->getNormalDest());
795   EXPECT_EQ(Invoke->getUnwindDest(), Clone->getUnwindDest());
796   EXPECT_EQ(Invoke->arg_size(), Clone->arg_size());
797   EXPECT_EQ(Invoke->getArgOperand(0), Clone->getArgOperand(0));
798   EXPECT_EQ(Invoke->getCallingConv(), Clone->getCallingConv());
799   EXPECT_TRUE(Clone->hasFnAttr(Attribute::AttrKind::Cold));
800   EXPECT_EQ(Invoke->getDebugLoc(), Clone->getDebugLoc());
801   EXPECT_EQ(Clone->getNumOperandBundles(), 1U);
802   EXPECT_TRUE(Clone->getOperandBundle("after"));
803 }
804 
805 TEST_F(ModuleWithFunctionTest, DropPoisonGeneratingFlags) {
806   auto *OnlyBB = BasicBlock::Create(Ctx, "bb", F);
807   auto *Arg0 = &*F->arg_begin();
808 
809   IRBuilder<NoFolder> B(Ctx);
810   B.SetInsertPoint(OnlyBB);
811 
812   {
813     auto *UI =
814         cast<Instruction>(B.CreateUDiv(Arg0, Arg0, "", /*isExact*/ true));
815     ASSERT_TRUE(UI->isExact());
816     UI->dropPoisonGeneratingFlags();
817     ASSERT_FALSE(UI->isExact());
818   }
819 
820   {
821     auto *ShrI =
822         cast<Instruction>(B.CreateLShr(Arg0, Arg0, "", /*isExact*/ true));
823     ASSERT_TRUE(ShrI->isExact());
824     ShrI->dropPoisonGeneratingFlags();
825     ASSERT_FALSE(ShrI->isExact());
826   }
827 
828   {
829     auto *AI = cast<Instruction>(
830         B.CreateAdd(Arg0, Arg0, "", /*HasNUW*/ true, /*HasNSW*/ false));
831     ASSERT_TRUE(AI->hasNoUnsignedWrap());
832     AI->dropPoisonGeneratingFlags();
833     ASSERT_FALSE(AI->hasNoUnsignedWrap());
834     ASSERT_FALSE(AI->hasNoSignedWrap());
835   }
836 
837   {
838     auto *SI = cast<Instruction>(
839         B.CreateAdd(Arg0, Arg0, "", /*HasNUW*/ false, /*HasNSW*/ true));
840     ASSERT_TRUE(SI->hasNoSignedWrap());
841     SI->dropPoisonGeneratingFlags();
842     ASSERT_FALSE(SI->hasNoUnsignedWrap());
843     ASSERT_FALSE(SI->hasNoSignedWrap());
844   }
845 
846   {
847     auto *ShlI = cast<Instruction>(
848         B.CreateShl(Arg0, Arg0, "", /*HasNUW*/ true, /*HasNSW*/ true));
849     ASSERT_TRUE(ShlI->hasNoSignedWrap());
850     ASSERT_TRUE(ShlI->hasNoUnsignedWrap());
851     ShlI->dropPoisonGeneratingFlags();
852     ASSERT_FALSE(ShlI->hasNoUnsignedWrap());
853     ASSERT_FALSE(ShlI->hasNoSignedWrap());
854   }
855 
856   {
857     Value *GEPBase = Constant::getNullValue(B.getPtrTy());
858     auto *GI = cast<GetElementPtrInst>(
859         B.CreateInBoundsGEP(B.getInt8Ty(), GEPBase, Arg0));
860     ASSERT_TRUE(GI->isInBounds());
861     GI->dropPoisonGeneratingFlags();
862     ASSERT_FALSE(GI->isInBounds());
863   }
864 }
865 
866 TEST(InstructionsTest, GEPIndices) {
867   LLVMContext Context;
868   IRBuilder<NoFolder> Builder(Context);
869   Type *ElementTy = Builder.getInt8Ty();
870   Type *ArrTy = ArrayType::get(ArrayType::get(ElementTy, 64), 64);
871   Value *Indices[] = {
872     Builder.getInt32(0),
873     Builder.getInt32(13),
874     Builder.getInt32(42) };
875 
876   Value *V = Builder.CreateGEP(ArrTy, UndefValue::get(PointerType::getUnqual(ArrTy)),
877                                Indices);
878   ASSERT_TRUE(isa<GetElementPtrInst>(V));
879 
880   auto *GEPI = cast<GetElementPtrInst>(V);
881   ASSERT_NE(GEPI->idx_begin(), GEPI->idx_end());
882   ASSERT_EQ(GEPI->idx_end(), std::next(GEPI->idx_begin(), 3));
883   EXPECT_EQ(Indices[0], GEPI->idx_begin()[0]);
884   EXPECT_EQ(Indices[1], GEPI->idx_begin()[1]);
885   EXPECT_EQ(Indices[2], GEPI->idx_begin()[2]);
886   EXPECT_EQ(GEPI->idx_begin(), GEPI->indices().begin());
887   EXPECT_EQ(GEPI->idx_end(), GEPI->indices().end());
888 
889   const auto *CGEPI = GEPI;
890   ASSERT_NE(CGEPI->idx_begin(), CGEPI->idx_end());
891   ASSERT_EQ(CGEPI->idx_end(), std::next(CGEPI->idx_begin(), 3));
892   EXPECT_EQ(Indices[0], CGEPI->idx_begin()[0]);
893   EXPECT_EQ(Indices[1], CGEPI->idx_begin()[1]);
894   EXPECT_EQ(Indices[2], CGEPI->idx_begin()[2]);
895   EXPECT_EQ(CGEPI->idx_begin(), CGEPI->indices().begin());
896   EXPECT_EQ(CGEPI->idx_end(), CGEPI->indices().end());
897 
898   delete GEPI;
899 }
900 
901 TEST(InstructionsTest, SwitchInst) {
902   LLVMContext C;
903 
904   std::unique_ptr<BasicBlock> BB1, BB2, BB3;
905   BB1.reset(BasicBlock::Create(C));
906   BB2.reset(BasicBlock::Create(C));
907   BB3.reset(BasicBlock::Create(C));
908 
909   // We create block 0 after the others so that it gets destroyed first and
910   // clears the uses of the other basic blocks.
911   std::unique_ptr<BasicBlock> BB0(BasicBlock::Create(C));
912 
913   auto *Int32Ty = Type::getInt32Ty(C);
914 
915   SwitchInst *SI =
916       SwitchInst::Create(UndefValue::get(Int32Ty), BB0.get(), 3, BB0.get());
917   SI->addCase(ConstantInt::get(Int32Ty, 1), BB1.get());
918   SI->addCase(ConstantInt::get(Int32Ty, 2), BB2.get());
919   SI->addCase(ConstantInt::get(Int32Ty, 3), BB3.get());
920 
921   auto CI = SI->case_begin();
922   ASSERT_NE(CI, SI->case_end());
923   EXPECT_EQ(1, CI->getCaseValue()->getSExtValue());
924   EXPECT_EQ(BB1.get(), CI->getCaseSuccessor());
925   EXPECT_EQ(2, (CI + 1)->getCaseValue()->getSExtValue());
926   EXPECT_EQ(BB2.get(), (CI + 1)->getCaseSuccessor());
927   EXPECT_EQ(3, (CI + 2)->getCaseValue()->getSExtValue());
928   EXPECT_EQ(BB3.get(), (CI + 2)->getCaseSuccessor());
929   EXPECT_EQ(CI + 1, std::next(CI));
930   EXPECT_EQ(CI + 2, std::next(CI, 2));
931   EXPECT_EQ(CI + 3, std::next(CI, 3));
932   EXPECT_EQ(SI->case_end(), CI + 3);
933   EXPECT_EQ(0, CI - CI);
934   EXPECT_EQ(1, (CI + 1) - CI);
935   EXPECT_EQ(2, (CI + 2) - CI);
936   EXPECT_EQ(3, SI->case_end() - CI);
937   EXPECT_EQ(3, std::distance(CI, SI->case_end()));
938 
939   auto CCI = const_cast<const SwitchInst *>(SI)->case_begin();
940   SwitchInst::ConstCaseIt CCE = SI->case_end();
941   ASSERT_NE(CCI, SI->case_end());
942   EXPECT_EQ(1, CCI->getCaseValue()->getSExtValue());
943   EXPECT_EQ(BB1.get(), CCI->getCaseSuccessor());
944   EXPECT_EQ(2, (CCI + 1)->getCaseValue()->getSExtValue());
945   EXPECT_EQ(BB2.get(), (CCI + 1)->getCaseSuccessor());
946   EXPECT_EQ(3, (CCI + 2)->getCaseValue()->getSExtValue());
947   EXPECT_EQ(BB3.get(), (CCI + 2)->getCaseSuccessor());
948   EXPECT_EQ(CCI + 1, std::next(CCI));
949   EXPECT_EQ(CCI + 2, std::next(CCI, 2));
950   EXPECT_EQ(CCI + 3, std::next(CCI, 3));
951   EXPECT_EQ(CCE, CCI + 3);
952   EXPECT_EQ(0, CCI - CCI);
953   EXPECT_EQ(1, (CCI + 1) - CCI);
954   EXPECT_EQ(2, (CCI + 2) - CCI);
955   EXPECT_EQ(3, CCE - CCI);
956   EXPECT_EQ(3, std::distance(CCI, CCE));
957 
958   // Make sure that the const iterator is compatible with a const auto ref.
959   const auto &Handle = *CCI;
960   EXPECT_EQ(1, Handle.getCaseValue()->getSExtValue());
961   EXPECT_EQ(BB1.get(), Handle.getCaseSuccessor());
962 }
963 
964 TEST(InstructionsTest, SwitchInstProfUpdateWrapper) {
965   LLVMContext C;
966 
967   std::unique_ptr<BasicBlock> BB1, BB2, BB3;
968   BB1.reset(BasicBlock::Create(C));
969   BB2.reset(BasicBlock::Create(C));
970   BB3.reset(BasicBlock::Create(C));
971 
972   // We create block 0 after the others so that it gets destroyed first and
973   // clears the uses of the other basic blocks.
974   std::unique_ptr<BasicBlock> BB0(BasicBlock::Create(C));
975 
976   auto *Int32Ty = Type::getInt32Ty(C);
977 
978   SwitchInst *SI =
979       SwitchInst::Create(UndefValue::get(Int32Ty), BB0.get(), 4, BB0.get());
980   SI->addCase(ConstantInt::get(Int32Ty, 1), BB1.get());
981   SI->addCase(ConstantInt::get(Int32Ty, 2), BB2.get());
982   SI->setMetadata(LLVMContext::MD_prof,
983                   MDBuilder(C).createBranchWeights({ 9, 1, 22 }));
984 
985   {
986     SwitchInstProfUpdateWrapper SIW(*SI);
987     EXPECT_EQ(*SIW.getSuccessorWeight(0), 9u);
988     EXPECT_EQ(*SIW.getSuccessorWeight(1), 1u);
989     EXPECT_EQ(*SIW.getSuccessorWeight(2), 22u);
990     SIW.setSuccessorWeight(0, 99u);
991     SIW.setSuccessorWeight(1, 11u);
992     EXPECT_EQ(*SIW.getSuccessorWeight(0), 99u);
993     EXPECT_EQ(*SIW.getSuccessorWeight(1), 11u);
994     EXPECT_EQ(*SIW.getSuccessorWeight(2), 22u);
995   }
996 
997   { // Create another wrapper and check that the data persist.
998     SwitchInstProfUpdateWrapper SIW(*SI);
999     EXPECT_EQ(*SIW.getSuccessorWeight(0), 99u);
1000     EXPECT_EQ(*SIW.getSuccessorWeight(1), 11u);
1001     EXPECT_EQ(*SIW.getSuccessorWeight(2), 22u);
1002   }
1003 }
1004 
1005 TEST(InstructionsTest, CommuteShuffleMask) {
1006   SmallVector<int, 16> Indices({-1, 0, 7});
1007   ShuffleVectorInst::commuteShuffleMask(Indices, 4);
1008   EXPECT_THAT(Indices, testing::ContainerEq(ArrayRef<int>({-1, 4, 3})));
1009 }
1010 
1011 TEST(InstructionsTest, ShuffleMaskQueries) {
1012   // Create the elements for various constant vectors.
1013   LLVMContext Ctx;
1014   Type *Int32Ty = Type::getInt32Ty(Ctx);
1015   Constant *CU = UndefValue::get(Int32Ty);
1016   Constant *C0 = ConstantInt::get(Int32Ty, 0);
1017   Constant *C1 = ConstantInt::get(Int32Ty, 1);
1018   Constant *C2 = ConstantInt::get(Int32Ty, 2);
1019   Constant *C3 = ConstantInt::get(Int32Ty, 3);
1020   Constant *C4 = ConstantInt::get(Int32Ty, 4);
1021   Constant *C5 = ConstantInt::get(Int32Ty, 5);
1022   Constant *C6 = ConstantInt::get(Int32Ty, 6);
1023   Constant *C7 = ConstantInt::get(Int32Ty, 7);
1024 
1025   Constant *Identity = ConstantVector::get({C0, CU, C2, C3, C4});
1026   EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
1027       Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
1028   EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
1029       Identity,
1030       cast<FixedVectorType>(Identity->getType())
1031           ->getNumElements())); // identity is distinguished from select
1032   EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
1033       Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
1034   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1035       Identity, cast<FixedVectorType>(Identity->getType())
1036                     ->getNumElements())); // identity is always single source
1037   EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
1038       Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
1039   EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
1040       Identity, cast<FixedVectorType>(Identity->getType())->getNumElements()));
1041 
1042   Constant *Select = ConstantVector::get({CU, C1, C5});
1043   EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
1044       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1045   EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
1046       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1047   EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
1048       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1049   EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(
1050       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1051   EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
1052       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1053   EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
1054       Select, cast<FixedVectorType>(Select->getType())->getNumElements()));
1055 
1056   Constant *Reverse = ConstantVector::get({C3, C2, C1, CU});
1057   EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
1058       Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
1059   EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
1060       Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
1061   EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
1062       Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
1063   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1064       Reverse, cast<FixedVectorType>(Reverse->getType())
1065                    ->getNumElements())); // reverse is always single source
1066   EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
1067       Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
1068   EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
1069       Reverse, cast<FixedVectorType>(Reverse->getType())->getNumElements()));
1070 
1071   Constant *SingleSource = ConstantVector::get({C2, C2, C0, CU});
1072   EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
1073       SingleSource,
1074       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1075   EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
1076       SingleSource,
1077       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1078   EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
1079       SingleSource,
1080       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1081   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1082       SingleSource,
1083       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1084   EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
1085       SingleSource,
1086       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1087   EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
1088       SingleSource,
1089       cast<FixedVectorType>(SingleSource->getType())->getNumElements()));
1090 
1091   Constant *ZeroEltSplat = ConstantVector::get({C0, C0, CU, C0});
1092   EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
1093       ZeroEltSplat,
1094       cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
1095   EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
1096       ZeroEltSplat,
1097       cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
1098   EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
1099       ZeroEltSplat,
1100       cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
1101   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1102       ZeroEltSplat, cast<FixedVectorType>(ZeroEltSplat->getType())
1103                         ->getNumElements())); // 0-splat is always single source
1104   EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
1105       ZeroEltSplat,
1106       cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
1107   EXPECT_FALSE(ShuffleVectorInst::isTransposeMask(
1108       ZeroEltSplat,
1109       cast<FixedVectorType>(ZeroEltSplat->getType())->getNumElements()));
1110 
1111   Constant *Transpose = ConstantVector::get({C0, C4, C2, C6});
1112   EXPECT_FALSE(ShuffleVectorInst::isIdentityMask(
1113       Transpose,
1114       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1115   EXPECT_FALSE(ShuffleVectorInst::isSelectMask(
1116       Transpose,
1117       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1118   EXPECT_FALSE(ShuffleVectorInst::isReverseMask(
1119       Transpose,
1120       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1121   EXPECT_FALSE(ShuffleVectorInst::isSingleSourceMask(
1122       Transpose,
1123       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1124   EXPECT_FALSE(ShuffleVectorInst::isZeroEltSplatMask(
1125       Transpose,
1126       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1127   EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(
1128       Transpose,
1129       cast<FixedVectorType>(Transpose->getType())->getNumElements()));
1130 
1131   // More tests to make sure the logic is/stays correct...
1132   EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
1133       ConstantVector::get({CU, C1, CU, C3}), 4));
1134   EXPECT_TRUE(ShuffleVectorInst::isIdentityMask(
1135       ConstantVector::get({C4, CU, C6, CU}), 4));
1136 
1137   EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
1138       ConstantVector::get({C4, C1, C6, CU}), 4));
1139   EXPECT_TRUE(ShuffleVectorInst::isSelectMask(
1140       ConstantVector::get({CU, C1, C6, C3}), 4));
1141 
1142   EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
1143       ConstantVector::get({C7, C6, CU, C4}), 4));
1144   EXPECT_TRUE(ShuffleVectorInst::isReverseMask(
1145       ConstantVector::get({C3, CU, C1, CU}), 4));
1146 
1147   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1148       ConstantVector::get({C7, C5, CU, C7}), 4));
1149   EXPECT_TRUE(ShuffleVectorInst::isSingleSourceMask(
1150       ConstantVector::get({C3, C0, CU, C3}), 4));
1151 
1152   EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
1153       ConstantVector::get({C4, CU, CU, C4}), 4));
1154   EXPECT_TRUE(ShuffleVectorInst::isZeroEltSplatMask(
1155       ConstantVector::get({CU, C0, CU, C0}), 4));
1156 
1157   EXPECT_TRUE(ShuffleVectorInst::isTransposeMask(
1158       ConstantVector::get({C1, C5, C3, C7}), 4));
1159   EXPECT_TRUE(
1160       ShuffleVectorInst::isTransposeMask(ConstantVector::get({C1, C3}), 2));
1161 
1162   // Nothing special about the values here - just re-using inputs to reduce
1163   // code.
1164   Constant *V0 = ConstantVector::get({C0, C1, C2, C3});
1165   Constant *V1 = ConstantVector::get({C3, C2, C1, C0});
1166 
1167   // Identity with undef elts.
1168   ShuffleVectorInst *Id1 = new ShuffleVectorInst(V0, V1,
1169                                                  ConstantVector::get({C0, C1, CU, CU}));
1170   EXPECT_TRUE(Id1->isIdentity());
1171   EXPECT_FALSE(Id1->isIdentityWithPadding());
1172   EXPECT_FALSE(Id1->isIdentityWithExtract());
1173   EXPECT_FALSE(Id1->isConcat());
1174   delete Id1;
1175 
1176   // Result has less elements than operands.
1177   ShuffleVectorInst *Id2 = new ShuffleVectorInst(V0, V1,
1178                                                  ConstantVector::get({C0, C1, C2}));
1179   EXPECT_FALSE(Id2->isIdentity());
1180   EXPECT_FALSE(Id2->isIdentityWithPadding());
1181   EXPECT_TRUE(Id2->isIdentityWithExtract());
1182   EXPECT_FALSE(Id2->isConcat());
1183   delete Id2;
1184 
1185   // Result has less elements than operands; choose from Op1.
1186   ShuffleVectorInst *Id3 = new ShuffleVectorInst(V0, V1,
1187                                                  ConstantVector::get({C4, CU, C6}));
1188   EXPECT_FALSE(Id3->isIdentity());
1189   EXPECT_FALSE(Id3->isIdentityWithPadding());
1190   EXPECT_TRUE(Id3->isIdentityWithExtract());
1191   EXPECT_FALSE(Id3->isConcat());
1192   delete Id3;
1193 
1194   // Result has less elements than operands; choose from Op0 and Op1 is not identity.
1195   ShuffleVectorInst *Id4 = new ShuffleVectorInst(V0, V1,
1196                                                  ConstantVector::get({C4, C1, C6}));
1197   EXPECT_FALSE(Id4->isIdentity());
1198   EXPECT_FALSE(Id4->isIdentityWithPadding());
1199   EXPECT_FALSE(Id4->isIdentityWithExtract());
1200   EXPECT_FALSE(Id4->isConcat());
1201   delete Id4;
1202 
1203   // Result has more elements than operands, and extra elements are undef.
1204   ShuffleVectorInst *Id5 = new ShuffleVectorInst(V0, V1,
1205                                                  ConstantVector::get({CU, C1, C2, C3, CU, CU}));
1206   EXPECT_FALSE(Id5->isIdentity());
1207   EXPECT_TRUE(Id5->isIdentityWithPadding());
1208   EXPECT_FALSE(Id5->isIdentityWithExtract());
1209   EXPECT_FALSE(Id5->isConcat());
1210   delete Id5;
1211 
1212   // Result has more elements than operands, and extra elements are undef; choose from Op1.
1213   ShuffleVectorInst *Id6 = new ShuffleVectorInst(V0, V1,
1214                                                  ConstantVector::get({C4, C5, C6, CU, CU, CU}));
1215   EXPECT_FALSE(Id6->isIdentity());
1216   EXPECT_TRUE(Id6->isIdentityWithPadding());
1217   EXPECT_FALSE(Id6->isIdentityWithExtract());
1218   EXPECT_FALSE(Id6->isConcat());
1219   delete Id6;
1220 
1221   // Result has more elements than operands, but extra elements are not undef.
1222   ShuffleVectorInst *Id7 = new ShuffleVectorInst(V0, V1,
1223                                                  ConstantVector::get({C0, C1, C2, C3, CU, C1}));
1224   EXPECT_FALSE(Id7->isIdentity());
1225   EXPECT_FALSE(Id7->isIdentityWithPadding());
1226   EXPECT_FALSE(Id7->isIdentityWithExtract());
1227   EXPECT_FALSE(Id7->isConcat());
1228   delete Id7;
1229 
1230   // Result has more elements than operands; choose from Op0 and Op1 is not identity.
1231   ShuffleVectorInst *Id8 = new ShuffleVectorInst(V0, V1,
1232                                                  ConstantVector::get({C4, CU, C2, C3, CU, CU}));
1233   EXPECT_FALSE(Id8->isIdentity());
1234   EXPECT_FALSE(Id8->isIdentityWithPadding());
1235   EXPECT_FALSE(Id8->isIdentityWithExtract());
1236   EXPECT_FALSE(Id8->isConcat());
1237   delete Id8;
1238 
1239   // Result has twice as many elements as operands; choose consecutively from Op0 and Op1 is concat.
1240   ShuffleVectorInst *Id9 = new ShuffleVectorInst(V0, V1,
1241                                                  ConstantVector::get({C0, CU, C2, C3, CU, CU, C6, C7}));
1242   EXPECT_FALSE(Id9->isIdentity());
1243   EXPECT_FALSE(Id9->isIdentityWithPadding());
1244   EXPECT_FALSE(Id9->isIdentityWithExtract());
1245   EXPECT_TRUE(Id9->isConcat());
1246   delete Id9;
1247 
1248   // Result has less than twice as many elements as operands, so not a concat.
1249   ShuffleVectorInst *Id10 = new ShuffleVectorInst(V0, V1,
1250                                                   ConstantVector::get({C0, CU, C2, C3, CU, CU, C6}));
1251   EXPECT_FALSE(Id10->isIdentity());
1252   EXPECT_FALSE(Id10->isIdentityWithPadding());
1253   EXPECT_FALSE(Id10->isIdentityWithExtract());
1254   EXPECT_FALSE(Id10->isConcat());
1255   delete Id10;
1256 
1257   // Result has more than twice as many elements as operands, so not a concat.
1258   ShuffleVectorInst *Id11 = new ShuffleVectorInst(V0, V1,
1259                                                   ConstantVector::get({C0, CU, C2, C3, CU, CU, C6, C7, CU}));
1260   EXPECT_FALSE(Id11->isIdentity());
1261   EXPECT_FALSE(Id11->isIdentityWithPadding());
1262   EXPECT_FALSE(Id11->isIdentityWithExtract());
1263   EXPECT_FALSE(Id11->isConcat());
1264   delete Id11;
1265 
1266   // If an input is undef, it's not a concat.
1267   // TODO: IdentityWithPadding should be true here even though the high mask values are not undef.
1268   ShuffleVectorInst *Id12 = new ShuffleVectorInst(V0, ConstantVector::get({CU, CU, CU, CU}),
1269                                                   ConstantVector::get({C0, CU, C2, C3, CU, CU, C6, C7}));
1270   EXPECT_FALSE(Id12->isIdentity());
1271   EXPECT_FALSE(Id12->isIdentityWithPadding());
1272   EXPECT_FALSE(Id12->isIdentityWithExtract());
1273   EXPECT_FALSE(Id12->isConcat());
1274   delete Id12;
1275 
1276   // Not possible to express shuffle mask for scalable vector for extract
1277   // subvector.
1278   Type *VScaleV4Int32Ty = ScalableVectorType::get(Int32Ty, 4);
1279   ShuffleVectorInst *Id13 =
1280       new ShuffleVectorInst(Constant::getAllOnesValue(VScaleV4Int32Ty),
1281                             UndefValue::get(VScaleV4Int32Ty),
1282                             Constant::getNullValue(VScaleV4Int32Ty));
1283   int Index = 0;
1284   EXPECT_FALSE(Id13->isExtractSubvectorMask(Index));
1285   EXPECT_FALSE(Id13->changesLength());
1286   EXPECT_FALSE(Id13->increasesLength());
1287   delete Id13;
1288 
1289   // Result has twice as many operands.
1290   Type *VScaleV2Int32Ty = ScalableVectorType::get(Int32Ty, 2);
1291   ShuffleVectorInst *Id14 =
1292       new ShuffleVectorInst(Constant::getAllOnesValue(VScaleV2Int32Ty),
1293                             UndefValue::get(VScaleV2Int32Ty),
1294                             Constant::getNullValue(VScaleV4Int32Ty));
1295   EXPECT_TRUE(Id14->changesLength());
1296   EXPECT_TRUE(Id14->increasesLength());
1297   delete Id14;
1298 
1299   // Not possible to express these masks for scalable vectors, make sure we
1300   // don't crash.
1301   ShuffleVectorInst *Id15 =
1302       new ShuffleVectorInst(Constant::getAllOnesValue(VScaleV2Int32Ty),
1303                             Constant::getNullValue(VScaleV2Int32Ty),
1304                             Constant::getNullValue(VScaleV2Int32Ty));
1305   EXPECT_FALSE(Id15->isIdentityWithPadding());
1306   EXPECT_FALSE(Id15->isIdentityWithExtract());
1307   EXPECT_FALSE(Id15->isConcat());
1308   delete Id15;
1309 }
1310 
1311 TEST(InstructionsTest, ShuffleMaskIsReplicationMask) {
1312   for (int ReplicationFactor : seq_inclusive(1, 8)) {
1313     for (int VF : seq_inclusive(1, 8)) {
1314       const auto ReplicatedMask = createReplicatedMask(ReplicationFactor, VF);
1315       int GuessedReplicationFactor = -1, GuessedVF = -1;
1316       EXPECT_TRUE(ShuffleVectorInst::isReplicationMask(
1317           ReplicatedMask, GuessedReplicationFactor, GuessedVF));
1318       EXPECT_EQ(GuessedReplicationFactor, ReplicationFactor);
1319       EXPECT_EQ(GuessedVF, VF);
1320 
1321       for (int OpVF : seq_inclusive(VF, 2 * VF + 1)) {
1322         LLVMContext Ctx;
1323         Type *OpVFTy = FixedVectorType::get(IntegerType::getInt1Ty(Ctx), OpVF);
1324         Value *Op = ConstantVector::getNullValue(OpVFTy);
1325         ShuffleVectorInst *SVI = new ShuffleVectorInst(Op, Op, ReplicatedMask);
1326         EXPECT_EQ(SVI->isReplicationMask(GuessedReplicationFactor, GuessedVF),
1327                   OpVF == VF);
1328         delete SVI;
1329       }
1330     }
1331   }
1332 }
1333 
1334 TEST(InstructionsTest, ShuffleMaskIsReplicationMask_undef) {
1335   for (int ReplicationFactor : seq_inclusive(1, 4)) {
1336     for (int VF : seq_inclusive(1, 4)) {
1337       const auto ReplicatedMask = createReplicatedMask(ReplicationFactor, VF);
1338       int GuessedReplicationFactor = -1, GuessedVF = -1;
1339 
1340       // If we change some mask elements to undef, we should still match.
1341 
1342       SmallVector<SmallVector<bool>> ElementChoices(ReplicatedMask.size(),
1343                                                     {false, true});
1344 
1345       CombinationGenerator<bool, decltype(ElementChoices)::value_type,
1346                            /*variable_smallsize=*/4>
1347           G(ElementChoices);
1348 
1349       G.generate([&](ArrayRef<bool> UndefOverrides) -> bool {
1350         SmallVector<int> AdjustedMask;
1351         AdjustedMask.reserve(ReplicatedMask.size());
1352         for (auto I : zip(ReplicatedMask, UndefOverrides))
1353           AdjustedMask.emplace_back(std::get<1>(I) ? -1 : std::get<0>(I));
1354         assert(AdjustedMask.size() == ReplicatedMask.size() &&
1355                "Size misprediction");
1356 
1357         EXPECT_TRUE(ShuffleVectorInst::isReplicationMask(
1358             AdjustedMask, GuessedReplicationFactor, GuessedVF));
1359         // Do not check GuessedReplicationFactor and GuessedVF,
1360         // with enough undef's we may deduce a different tuple.
1361 
1362         return /*Abort=*/false;
1363       });
1364     }
1365   }
1366 }
1367 
1368 TEST(InstructionsTest, ShuffleMaskIsReplicationMask_Exhaustive_Correctness) {
1369   for (int ShufMaskNumElts : seq_inclusive(1, 6)) {
1370     SmallVector<int> PossibleShufMaskElts;
1371     PossibleShufMaskElts.reserve(ShufMaskNumElts + 2);
1372     for (int PossibleShufMaskElt : seq_inclusive(-1, ShufMaskNumElts))
1373       PossibleShufMaskElts.emplace_back(PossibleShufMaskElt);
1374     assert(PossibleShufMaskElts.size() == ShufMaskNumElts + 2U &&
1375            "Size misprediction");
1376 
1377     SmallVector<SmallVector<int>> ElementChoices(ShufMaskNumElts,
1378                                                  PossibleShufMaskElts);
1379 
1380     CombinationGenerator<int, decltype(ElementChoices)::value_type,
1381                          /*variable_smallsize=*/4>
1382         G(ElementChoices);
1383 
1384     G.generate([&](ArrayRef<int> Mask) -> bool {
1385       int GuessedReplicationFactor = -1, GuessedVF = -1;
1386       bool Match = ShuffleVectorInst::isReplicationMask(
1387           Mask, GuessedReplicationFactor, GuessedVF);
1388       if (!Match)
1389         return /*Abort=*/false;
1390 
1391       const auto ActualMask =
1392           createReplicatedMask(GuessedReplicationFactor, GuessedVF);
1393       EXPECT_EQ(Mask.size(), ActualMask.size());
1394       for (auto I : zip(Mask, ActualMask)) {
1395         int Elt = std::get<0>(I);
1396         int ActualElt = std::get<0>(I);
1397 
1398         if (Elt != -1) {
1399           EXPECT_EQ(Elt, ActualElt);
1400         }
1401       }
1402 
1403       return /*Abort=*/false;
1404     });
1405   }
1406 }
1407 
1408 TEST(InstructionsTest, GetSplat) {
1409   // Create the elements for various constant vectors.
1410   LLVMContext Ctx;
1411   Type *Int32Ty = Type::getInt32Ty(Ctx);
1412   Constant *CU = UndefValue::get(Int32Ty);
1413   Constant *CP = PoisonValue::get(Int32Ty);
1414   Constant *C0 = ConstantInt::get(Int32Ty, 0);
1415   Constant *C1 = ConstantInt::get(Int32Ty, 1);
1416 
1417   Constant *Splat0 = ConstantVector::get({C0, C0, C0, C0});
1418   Constant *Splat1 = ConstantVector::get({C1, C1, C1, C1 ,C1});
1419   Constant *Splat0Undef = ConstantVector::get({C0, CU, C0, CU});
1420   Constant *Splat1Undef = ConstantVector::get({CU, CU, C1, CU});
1421   Constant *NotSplat = ConstantVector::get({C1, C1, C0, C1 ,C1});
1422   Constant *NotSplatUndef = ConstantVector::get({CU, C1, CU, CU ,C0});
1423   Constant *Splat0Poison = ConstantVector::get({C0, CP, C0, CP});
1424   Constant *Splat1Poison = ConstantVector::get({CP, CP, C1, CP});
1425   Constant *NotSplatPoison = ConstantVector::get({CP, C1, CP, CP, C0});
1426 
1427   // Default - undef/poison is not allowed.
1428   EXPECT_EQ(Splat0->getSplatValue(), C0);
1429   EXPECT_EQ(Splat1->getSplatValue(), C1);
1430   EXPECT_EQ(Splat0Undef->getSplatValue(), nullptr);
1431   EXPECT_EQ(Splat1Undef->getSplatValue(), nullptr);
1432   EXPECT_EQ(Splat0Poison->getSplatValue(), nullptr);
1433   EXPECT_EQ(Splat1Poison->getSplatValue(), nullptr);
1434   EXPECT_EQ(NotSplat->getSplatValue(), nullptr);
1435   EXPECT_EQ(NotSplatUndef->getSplatValue(), nullptr);
1436   EXPECT_EQ(NotSplatPoison->getSplatValue(), nullptr);
1437 
1438   // Disallow poison explicitly.
1439   EXPECT_EQ(Splat0->getSplatValue(false), C0);
1440   EXPECT_EQ(Splat1->getSplatValue(false), C1);
1441   EXPECT_EQ(Splat0Undef->getSplatValue(false), nullptr);
1442   EXPECT_EQ(Splat1Undef->getSplatValue(false), nullptr);
1443   EXPECT_EQ(Splat0Poison->getSplatValue(false), nullptr);
1444   EXPECT_EQ(Splat1Poison->getSplatValue(false), nullptr);
1445   EXPECT_EQ(NotSplat->getSplatValue(false), nullptr);
1446   EXPECT_EQ(NotSplatUndef->getSplatValue(false), nullptr);
1447   EXPECT_EQ(NotSplatPoison->getSplatValue(false), nullptr);
1448 
1449   // Allow poison but not undef.
1450   EXPECT_EQ(Splat0->getSplatValue(true), C0);
1451   EXPECT_EQ(Splat1->getSplatValue(true), C1);
1452   EXPECT_EQ(Splat0Undef->getSplatValue(true), nullptr);
1453   EXPECT_EQ(Splat1Undef->getSplatValue(true), nullptr);
1454   EXPECT_EQ(Splat0Poison->getSplatValue(true), C0);
1455   EXPECT_EQ(Splat1Poison->getSplatValue(true), C1);
1456   EXPECT_EQ(NotSplat->getSplatValue(true), nullptr);
1457   EXPECT_EQ(NotSplatUndef->getSplatValue(true), nullptr);
1458   EXPECT_EQ(NotSplatPoison->getSplatValue(true), nullptr);
1459 }
1460 
1461 TEST(InstructionsTest, SkipDebug) {
1462   LLVMContext C;
1463   bool OldDbgValueMode = UseNewDbgInfoFormat;
1464   UseNewDbgInfoFormat = false;
1465   std::unique_ptr<Module> M = parseIR(C,
1466                                       R"(
1467       declare void @llvm.dbg.value(metadata, metadata, metadata)
1468 
1469       define void @f() {
1470       entry:
1471         call void @llvm.dbg.value(metadata i32 0, metadata !11, metadata !DIExpression()), !dbg !13
1472         ret void
1473       }
1474 
1475       !llvm.dbg.cu = !{!0}
1476       !llvm.module.flags = !{!3, !4}
1477       !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
1478       !1 = !DIFile(filename: "t2.c", directory: "foo")
1479       !2 = !{}
1480       !3 = !{i32 2, !"Dwarf Version", i32 4}
1481       !4 = !{i32 2, !"Debug Info Version", i32 3}
1482       !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)
1483       !9 = !DISubroutineType(types: !10)
1484       !10 = !{null}
1485       !11 = !DILocalVariable(name: "x", scope: !8, file: !1, line: 2, type: !12)
1486       !12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
1487       !13 = !DILocation(line: 2, column: 7, scope: !8)
1488   )");
1489   ASSERT_TRUE(M);
1490   Function *F = cast<Function>(M->getNamedValue("f"));
1491   BasicBlock &BB = F->front();
1492 
1493   // The first non-debug instruction is the terminator.
1494   auto *Term = BB.getTerminator();
1495   EXPECT_EQ(Term, BB.begin()->getNextNonDebugInstruction());
1496   EXPECT_EQ(Term->getIterator(), skipDebugIntrinsics(BB.begin()));
1497 
1498   // After the terminator, there are no non-debug instructions.
1499   EXPECT_EQ(nullptr, Term->getNextNonDebugInstruction());
1500   UseNewDbgInfoFormat = OldDbgValueMode;
1501 }
1502 
1503 TEST(InstructionsTest, PhiMightNotBeFPMathOperator) {
1504   LLVMContext Context;
1505   IRBuilder<> Builder(Context);
1506   MDBuilder MDHelper(Context);
1507   Instruction *I = Builder.CreatePHI(Builder.getInt32Ty(), 0);
1508   EXPECT_FALSE(isa<FPMathOperator>(I));
1509   I->deleteValue();
1510   Instruction *FP = Builder.CreatePHI(Builder.getDoubleTy(), 0);
1511   EXPECT_TRUE(isa<FPMathOperator>(FP));
1512   FP->deleteValue();
1513 }
1514 
1515 TEST(InstructionsTest, FPCallIsFPMathOperator) {
1516   LLVMContext C;
1517 
1518   Type *ITy = Type::getInt32Ty(C);
1519   FunctionType *IFnTy = FunctionType::get(ITy, {});
1520   PointerType *PtrTy = PointerType::getUnqual(C);
1521   Value *ICallee = Constant::getNullValue(PtrTy);
1522   std::unique_ptr<CallInst> ICall(CallInst::Create(IFnTy, ICallee, {}, ""));
1523   EXPECT_FALSE(isa<FPMathOperator>(ICall));
1524 
1525   Type *VITy = FixedVectorType::get(ITy, 2);
1526   FunctionType *VIFnTy = FunctionType::get(VITy, {});
1527   Value *VICallee = Constant::getNullValue(PtrTy);
1528   std::unique_ptr<CallInst> VICall(CallInst::Create(VIFnTy, VICallee, {}, ""));
1529   EXPECT_FALSE(isa<FPMathOperator>(VICall));
1530 
1531   Type *AITy = ArrayType::get(ITy, 2);
1532   FunctionType *AIFnTy = FunctionType::get(AITy, {});
1533   Value *AICallee = Constant::getNullValue(PtrTy);
1534   std::unique_ptr<CallInst> AICall(CallInst::Create(AIFnTy, AICallee, {}, ""));
1535   EXPECT_FALSE(isa<FPMathOperator>(AICall));
1536 
1537   Type *FTy = Type::getFloatTy(C);
1538   FunctionType *FFnTy = FunctionType::get(FTy, {});
1539   Value *FCallee = Constant::getNullValue(PtrTy);
1540   std::unique_ptr<CallInst> FCall(CallInst::Create(FFnTy, FCallee, {}, ""));
1541   EXPECT_TRUE(isa<FPMathOperator>(FCall));
1542 
1543   Type *VFTy = FixedVectorType::get(FTy, 2);
1544   FunctionType *VFFnTy = FunctionType::get(VFTy, {});
1545   Value *VFCallee = Constant::getNullValue(PtrTy);
1546   std::unique_ptr<CallInst> VFCall(CallInst::Create(VFFnTy, VFCallee, {}, ""));
1547   EXPECT_TRUE(isa<FPMathOperator>(VFCall));
1548 
1549   Type *AFTy = ArrayType::get(FTy, 2);
1550   FunctionType *AFFnTy = FunctionType::get(AFTy, {});
1551   Value *AFCallee = Constant::getNullValue(PtrTy);
1552   std::unique_ptr<CallInst> AFCall(CallInst::Create(AFFnTy, AFCallee, {}, ""));
1553   EXPECT_TRUE(isa<FPMathOperator>(AFCall));
1554 
1555   Type *AVFTy = ArrayType::get(VFTy, 2);
1556   FunctionType *AVFFnTy = FunctionType::get(AVFTy, {});
1557   Value *AVFCallee = Constant::getNullValue(PtrTy);
1558   std::unique_ptr<CallInst> AVFCall(
1559       CallInst::Create(AVFFnTy, AVFCallee, {}, ""));
1560   EXPECT_TRUE(isa<FPMathOperator>(AVFCall));
1561 
1562   Type *StructITy = StructType::get(ITy, ITy);
1563   FunctionType *StructIFnTy = FunctionType::get(StructITy, {});
1564   Value *StructICallee = Constant::getNullValue(PtrTy);
1565   std::unique_ptr<CallInst> StructICall(
1566       CallInst::Create(StructIFnTy, StructICallee, {}, ""));
1567   EXPECT_FALSE(isa<FPMathOperator>(StructICall));
1568 
1569   Type *EmptyStructTy = StructType::get(C);
1570   FunctionType *EmptyStructFnTy = FunctionType::get(EmptyStructTy, {});
1571   Value *EmptyStructCallee = Constant::getNullValue(PtrTy);
1572   std::unique_ptr<CallInst> EmptyStructCall(
1573       CallInst::Create(EmptyStructFnTy, EmptyStructCallee, {}, ""));
1574   EXPECT_FALSE(isa<FPMathOperator>(EmptyStructCall));
1575 
1576   Type *NamedStructFTy = StructType::create({FTy, FTy}, "AStruct");
1577   FunctionType *NamedStructFFnTy = FunctionType::get(NamedStructFTy, {});
1578   Value *NamedStructFCallee = Constant::getNullValue(PtrTy);
1579   std::unique_ptr<CallInst> NamedStructFCall(
1580       CallInst::Create(NamedStructFFnTy, NamedStructFCallee, {}, ""));
1581   EXPECT_FALSE(isa<FPMathOperator>(NamedStructFCall));
1582 
1583   Type *MixedStructTy = StructType::get(FTy, ITy);
1584   FunctionType *MixedStructFnTy = FunctionType::get(MixedStructTy, {});
1585   Value *MixedStructCallee = Constant::getNullValue(PtrTy);
1586   std::unique_ptr<CallInst> MixedStructCall(
1587       CallInst::Create(MixedStructFnTy, MixedStructCallee, {}, ""));
1588   EXPECT_FALSE(isa<FPMathOperator>(MixedStructCall));
1589 
1590   Type *StructFTy = StructType::get(FTy, FTy, FTy);
1591   FunctionType *StructFFnTy = FunctionType::get(StructFTy, {});
1592   Value *StructFCallee = Constant::getNullValue(PtrTy);
1593   std::unique_ptr<CallInst> StructFCall(
1594       CallInst::Create(StructFFnTy, StructFCallee, {}, ""));
1595   EXPECT_TRUE(isa<FPMathOperator>(StructFCall));
1596 
1597   Type *StructVFTy = StructType::get(VFTy, VFTy, VFTy, VFTy);
1598   FunctionType *StructVFFnTy = FunctionType::get(StructVFTy, {});
1599   Value *StructVFCallee = Constant::getNullValue(PtrTy);
1600   std::unique_ptr<CallInst> StructVFCall(
1601       CallInst::Create(StructVFFnTy, StructVFCallee, {}, ""));
1602   EXPECT_TRUE(isa<FPMathOperator>(StructVFCall));
1603 
1604   Type *NestedStructFTy = StructType::get(StructFTy, StructFTy, StructFTy);
1605   FunctionType *NestedStructFFnTy = FunctionType::get(NestedStructFTy, {});
1606   Value *NestedStructFCallee = Constant::getNullValue(PtrTy);
1607   std::unique_ptr<CallInst> NestedStructFCall(
1608       CallInst::Create(NestedStructFFnTy, NestedStructFCallee, {}, ""));
1609   EXPECT_FALSE(isa<FPMathOperator>(NestedStructFCall));
1610 
1611   Type *AStructFTy = ArrayType::get(StructFTy, 5);
1612   FunctionType *AStructFFnTy = FunctionType::get(AStructFTy, {});
1613   Value *AStructFCallee = Constant::getNullValue(PtrTy);
1614   std::unique_ptr<CallInst> AStructFCall(
1615       CallInst::Create(AStructFFnTy, AStructFCallee, {}, ""));
1616   EXPECT_FALSE(isa<FPMathOperator>(AStructFCall));
1617 }
1618 
1619 TEST(InstructionsTest, FNegInstruction) {
1620   LLVMContext Context;
1621   Type *FltTy = Type::getFloatTy(Context);
1622   Constant *One = ConstantFP::get(FltTy, 1.0);
1623   BinaryOperator *FAdd = BinaryOperator::CreateFAdd(One, One);
1624   FAdd->setHasNoNaNs(true);
1625   UnaryOperator *FNeg = UnaryOperator::CreateFNegFMF(One, FAdd);
1626   EXPECT_TRUE(FNeg->hasNoNaNs());
1627   EXPECT_FALSE(FNeg->hasNoInfs());
1628   EXPECT_FALSE(FNeg->hasNoSignedZeros());
1629   EXPECT_FALSE(FNeg->hasAllowReciprocal());
1630   EXPECT_FALSE(FNeg->hasAllowContract());
1631   EXPECT_FALSE(FNeg->hasAllowReassoc());
1632   EXPECT_FALSE(FNeg->hasApproxFunc());
1633   FAdd->deleteValue();
1634   FNeg->deleteValue();
1635 }
1636 
1637 TEST(InstructionsTest, CallBrInstruction) {
1638   LLVMContext Context;
1639   std::unique_ptr<Module> M = parseIR(Context, R"(
1640 define void @foo() {
1641 entry:
1642   callbr void asm sideeffect "// XXX: ${0:l}", "!i"()
1643           to label %land.rhs.i [label %branch_test.exit]
1644 
1645 land.rhs.i:
1646   br label %branch_test.exit
1647 
1648 branch_test.exit:
1649   %0 = phi i1 [ true, %entry ], [ false, %land.rhs.i ]
1650   br i1 %0, label %if.end, label %if.then
1651 
1652 if.then:
1653   ret void
1654 
1655 if.end:
1656   ret void
1657 }
1658 )");
1659   Function *Foo = M->getFunction("foo");
1660   auto BBs = Foo->begin();
1661   CallBrInst &CBI = cast<CallBrInst>(BBs->front());
1662   ++BBs;
1663   ++BBs;
1664   BasicBlock &BranchTestExit = *BBs;
1665   ++BBs;
1666   BasicBlock &IfThen = *BBs;
1667 
1668   // Test that setting the first indirect destination of callbr updates the dest
1669   EXPECT_EQ(&BranchTestExit, CBI.getIndirectDest(0));
1670   CBI.setIndirectDest(0, &IfThen);
1671   EXPECT_EQ(&IfThen, CBI.getIndirectDest(0));
1672 }
1673 
1674 TEST(InstructionsTest, UnaryOperator) {
1675   LLVMContext Context;
1676   IRBuilder<> Builder(Context);
1677   Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
1678   Value *F = Builder.CreateFNeg(I);
1679 
1680   EXPECT_TRUE(isa<Value>(F));
1681   EXPECT_TRUE(isa<Instruction>(F));
1682   EXPECT_TRUE(isa<UnaryInstruction>(F));
1683   EXPECT_TRUE(isa<UnaryOperator>(F));
1684   EXPECT_FALSE(isa<BinaryOperator>(F));
1685 
1686   F->deleteValue();
1687   I->deleteValue();
1688 }
1689 
1690 TEST(InstructionsTest, DropLocation) {
1691   LLVMContext C;
1692   std::unique_ptr<Module> M = parseIR(C,
1693                                       R"(
1694       declare void @callee()
1695 
1696       define void @no_parent_scope() {
1697         call void @callee()           ; I1: Call with no location.
1698         call void @callee(), !dbg !11 ; I2: Call with location.
1699         ret void, !dbg !11            ; I3: Non-call with location.
1700       }
1701 
1702       define void @with_parent_scope() !dbg !8 {
1703         call void @callee()           ; I1: Call with no location.
1704         call void @callee(), !dbg !11 ; I2: Call with location.
1705         ret void, !dbg !11            ; I3: Non-call with location.
1706       }
1707 
1708       !llvm.dbg.cu = !{!0}
1709       !llvm.module.flags = !{!3, !4}
1710       !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
1711       !1 = !DIFile(filename: "t2.c", directory: "foo")
1712       !2 = !{}
1713       !3 = !{i32 2, !"Dwarf Version", i32 4}
1714       !4 = !{i32 2, !"Debug Info Version", i32 3}
1715       !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)
1716       !9 = !DISubroutineType(types: !10)
1717       !10 = !{null}
1718       !11 = !DILocation(line: 2, column: 7, scope: !8, inlinedAt: !12)
1719       !12 = !DILocation(line: 3, column: 8, scope: !8)
1720   )");
1721   ASSERT_TRUE(M);
1722 
1723   {
1724     Function *NoParentScopeF =
1725         cast<Function>(M->getNamedValue("no_parent_scope"));
1726     BasicBlock &BB = NoParentScopeF->front();
1727 
1728     auto *I1 = BB.getFirstNonPHI();
1729     auto *I2 = I1->getNextNode();
1730     auto *I3 = BB.getTerminator();
1731 
1732     EXPECT_EQ(I1->getDebugLoc(), DebugLoc());
1733     I1->dropLocation();
1734     EXPECT_EQ(I1->getDebugLoc(), DebugLoc());
1735 
1736     EXPECT_EQ(I2->getDebugLoc().getLine(), 2U);
1737     I2->dropLocation();
1738     EXPECT_EQ(I1->getDebugLoc(), DebugLoc());
1739 
1740     EXPECT_EQ(I3->getDebugLoc().getLine(), 2U);
1741     I3->dropLocation();
1742     EXPECT_EQ(I3->getDebugLoc(), DebugLoc());
1743   }
1744 
1745   {
1746     Function *WithParentScopeF =
1747         cast<Function>(M->getNamedValue("with_parent_scope"));
1748     BasicBlock &BB = WithParentScopeF->front();
1749 
1750     auto *I2 = BB.getFirstNonPHI()->getNextNode();
1751 
1752     MDNode *Scope = cast<MDNode>(WithParentScopeF->getSubprogram());
1753     EXPECT_EQ(I2->getDebugLoc().getLine(), 2U);
1754     I2->dropLocation();
1755     EXPECT_EQ(I2->getDebugLoc().getLine(), 0U);
1756     EXPECT_EQ(I2->getDebugLoc().getScope(), Scope);
1757     EXPECT_EQ(I2->getDebugLoc().getInlinedAt(), nullptr);
1758   }
1759 }
1760 
1761 TEST(InstructionsTest, BranchWeightOverflow) {
1762   LLVMContext C;
1763   std::unique_ptr<Module> M = parseIR(C,
1764                                       R"(
1765       declare void @callee()
1766 
1767       define void @caller() {
1768         call void @callee(), !prof !1
1769         ret void
1770       }
1771 
1772       !1 = !{!"branch_weights", i32 20000}
1773   )");
1774   ASSERT_TRUE(M);
1775   CallInst *CI =
1776       cast<CallInst>(&M->getFunction("caller")->getEntryBlock().front());
1777   uint64_t ProfWeight;
1778   CI->extractProfTotalWeight(ProfWeight);
1779   ASSERT_EQ(ProfWeight, 20000U);
1780   CI->updateProfWeight(10000000, 1);
1781   CI->extractProfTotalWeight(ProfWeight);
1782   ASSERT_EQ(ProfWeight, UINT32_MAX);
1783 }
1784 
1785 TEST(InstructionsTest, FreezeInst) {
1786   LLVMContext C;
1787   std::unique_ptr<Module> M = parseIR(C,
1788                                       R"(
1789       define void @foo(i8 %arg) {
1790         freeze i8 %arg
1791         ret void
1792   }
1793   )");
1794   ASSERT_TRUE(M);
1795   Value *FI = &M->getFunction("foo")->getEntryBlock().front();
1796   EXPECT_TRUE(isa<UnaryInstruction>(FI));
1797 }
1798 
1799 TEST(InstructionsTest, AllocaInst) {
1800   LLVMContext Ctx;
1801   std::unique_ptr<Module> M = parseIR(Ctx, R"(
1802       %T = type { i64, [3 x i32]}
1803       define void @f(i32 %n) {
1804       entry:
1805         %A = alloca i32, i32 1
1806         %B = alloca i32, i32 4
1807         %C = alloca i32, i32 %n
1808         %D = alloca double
1809         %E = alloca <vscale x 8 x double>
1810         %F = alloca [2 x half]
1811         %G = alloca [2 x [3 x i128]]
1812         %H = alloca %T
1813         %I = alloca i32, i64 9223372036854775807
1814         ret void
1815       }
1816     )");
1817   const DataLayout &DL = M->getDataLayout();
1818   ASSERT_TRUE(M);
1819   Function *Fun = cast<Function>(M->getNamedValue("f"));
1820   BasicBlock &BB = Fun->front();
1821   auto It = BB.begin();
1822   AllocaInst &A = cast<AllocaInst>(*It++);
1823   AllocaInst &B = cast<AllocaInst>(*It++);
1824   AllocaInst &C = cast<AllocaInst>(*It++);
1825   AllocaInst &D = cast<AllocaInst>(*It++);
1826   AllocaInst &E = cast<AllocaInst>(*It++);
1827   AllocaInst &F = cast<AllocaInst>(*It++);
1828   AllocaInst &G = cast<AllocaInst>(*It++);
1829   AllocaInst &H = cast<AllocaInst>(*It++);
1830   AllocaInst &I = cast<AllocaInst>(*It++);
1831   EXPECT_EQ(A.getAllocationSizeInBits(DL), TypeSize::getFixed(32));
1832   EXPECT_EQ(B.getAllocationSizeInBits(DL), TypeSize::getFixed(128));
1833   EXPECT_FALSE(C.getAllocationSizeInBits(DL));
1834   EXPECT_EQ(DL.getTypeSizeInBits(D.getAllocatedType()), TypeSize::getFixed(64));
1835   EXPECT_EQ(D.getAllocationSizeInBits(DL), TypeSize::getFixed(64));
1836   EXPECT_EQ(E.getAllocationSizeInBits(DL), TypeSize::getScalable(512));
1837   EXPECT_EQ(F.getAllocationSizeInBits(DL), TypeSize::getFixed(32));
1838   EXPECT_EQ(G.getAllocationSizeInBits(DL), TypeSize::getFixed(768));
1839   EXPECT_EQ(H.getAllocationSizeInBits(DL), TypeSize::getFixed(160));
1840   EXPECT_FALSE(I.getAllocationSizeInBits(DL));
1841 }
1842 
1843 TEST(InstructionsTest, InsertAtBegin) {
1844   LLVMContext Ctx;
1845   std::unique_ptr<Module> M = parseIR(Ctx, R"(
1846     define void @f(i32 %a, i32 %b) {
1847      entry:
1848        ret void
1849     }
1850 )");
1851   Function *F = &*M->begin();
1852   Argument *ArgA = F->getArg(0);
1853   Argument *ArgB = F->getArg(1);
1854   BasicBlock *BB = &*F->begin();
1855   Instruction *Ret = &*BB->begin();
1856   Instruction *I = BinaryOperator::CreateAdd(ArgA, ArgB);
1857   auto It = I->insertInto(BB, BB->begin());
1858   EXPECT_EQ(&*It, I);
1859   EXPECT_EQ(I->getNextNode(), Ret);
1860 }
1861 
1862 TEST(InstructionsTest, InsertAtEnd) {
1863   LLVMContext Ctx;
1864   std::unique_ptr<Module> M = parseIR(Ctx, R"(
1865     define void @f(i32 %a, i32 %b) {
1866      entry:
1867        ret void
1868     }
1869 )");
1870   Function *F = &*M->begin();
1871   Argument *ArgA = F->getArg(0);
1872   Argument *ArgB = F->getArg(1);
1873   BasicBlock *BB = &*F->begin();
1874   Instruction *Ret = &*BB->begin();
1875   Instruction *I = BinaryOperator::CreateAdd(ArgA, ArgB);
1876   auto It = I->insertInto(BB, BB->end());
1877   EXPECT_EQ(&*It, I);
1878   EXPECT_EQ(Ret->getNextNode(), I);
1879 }
1880 
1881 TEST(InstructionsTest, AtomicSyncscope) {
1882   LLVMContext Ctx;
1883 
1884   Module M("Mod", Ctx);
1885   FunctionType *FT = FunctionType::get(Type::getVoidTy(Ctx), {}, false);
1886   Function *F = Function::Create(FT, Function::ExternalLinkage, "Fun", M);
1887   BasicBlock *BB = BasicBlock::Create(Ctx, "Entry", F);
1888   IRBuilder<> Builder(BB);
1889 
1890   // SyncScope-variants of LLVM C IRBuilder APIs are tested by llvm-c-test,
1891   // so cover the old versions (with a SingleThreaded argument) here.
1892   Value *Ptr = ConstantPointerNull::get(Builder.getPtrTy());
1893   Value *Val = ConstantInt::get(Type::getInt32Ty(Ctx), 0);
1894 
1895   // fence
1896   LLVMValueRef Fence = LLVMBuildFence(
1897       wrap(&Builder), LLVMAtomicOrderingSequentiallyConsistent, 0, "");
1898   EXPECT_FALSE(LLVMIsAtomicSingleThread(Fence));
1899   Fence = LLVMBuildFence(wrap(&Builder),
1900                          LLVMAtomicOrderingSequentiallyConsistent, 1, "");
1901   EXPECT_TRUE(LLVMIsAtomicSingleThread(Fence));
1902 
1903   // atomicrmw
1904   LLVMValueRef AtomicRMW = LLVMBuildAtomicRMW(
1905       wrap(&Builder), LLVMAtomicRMWBinOpXchg, wrap(Ptr), wrap(Val),
1906       LLVMAtomicOrderingSequentiallyConsistent, 0);
1907   EXPECT_FALSE(LLVMIsAtomicSingleThread(AtomicRMW));
1908   AtomicRMW = LLVMBuildAtomicRMW(wrap(&Builder), LLVMAtomicRMWBinOpXchg,
1909                                  wrap(Ptr), wrap(Val),
1910                                  LLVMAtomicOrderingSequentiallyConsistent, 1);
1911   EXPECT_TRUE(LLVMIsAtomicSingleThread(AtomicRMW));
1912 
1913   // cmpxchg
1914   LLVMValueRef CmpXchg =
1915       LLVMBuildAtomicCmpXchg(wrap(&Builder), wrap(Ptr), wrap(Val), wrap(Val),
1916                              LLVMAtomicOrderingSequentiallyConsistent,
1917                              LLVMAtomicOrderingSequentiallyConsistent, 0);
1918   EXPECT_FALSE(LLVMIsAtomicSingleThread(CmpXchg));
1919   CmpXchg =
1920       LLVMBuildAtomicCmpXchg(wrap(&Builder), wrap(Ptr), wrap(Val), wrap(Val),
1921                              LLVMAtomicOrderingSequentiallyConsistent,
1922                              LLVMAtomicOrderingSequentiallyConsistent, 1);
1923   EXPECT_TRUE(LLVMIsAtomicSingleThread(CmpXchg));
1924 }
1925 
1926 TEST(InstructionsTest, CmpPredicate) {
1927   CmpPredicate P0(CmpInst::ICMP_ULE, false), P1(CmpInst::ICMP_ULE, true),
1928       P2(CmpInst::ICMP_SLE, false), P3(CmpInst::ICMP_SLT, false);
1929   CmpPredicate Q0 = P0, Q1 = P1, Q2 = P2;
1930   CmpInst::Predicate R0 = P0, R1 = P1, R2 = P2;
1931 
1932   EXPECT_EQ(*CmpPredicate::getMatching(P0, P1), CmpInst::ICMP_ULE);
1933   EXPECT_EQ(CmpPredicate::getMatching(P0, P1)->hasSameSign(), false);
1934   EXPECT_EQ(*CmpPredicate::getMatching(P1, P1), CmpInst::ICMP_ULE);
1935   EXPECT_EQ(CmpPredicate::getMatching(P1, P1)->hasSameSign(), true);
1936   EXPECT_EQ(CmpPredicate::getMatching(P0, P2), std::nullopt);
1937   EXPECT_EQ(*CmpPredicate::getMatching(P1, P2), CmpInst::ICMP_SLE);
1938   EXPECT_EQ(CmpPredicate::getMatching(P1, P2)->hasSameSign(), false);
1939   EXPECT_EQ(CmpPredicate::getMatching(P1, P3), std::nullopt);
1940   EXPECT_FALSE(Q0.hasSameSign());
1941   EXPECT_TRUE(Q1.hasSameSign());
1942   EXPECT_FALSE(Q2.hasSameSign());
1943   EXPECT_EQ(P0, R0);
1944   EXPECT_EQ(P1, R1);
1945   EXPECT_EQ(P2, R2);
1946 }
1947 
1948 } // end anonymous namespace
1949 } // end namespace llvm
1950