1c779e96158cbac4c62df8e2053ab6a933eba5868Chandler Carruth//===- llvm/unittest/IR/InstructionsTest.cpp - Instructions unit tests ----===//
25a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif//
35a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif//                     The LLVM Compiler Infrastructure
45a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif//
55a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif// This file is distributed under the University of Illinois Open Source
65a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif// License. See LICENSE.TXT for details.
75a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif//
85a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif//===----------------------------------------------------------------------===//
95a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif
100b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
115a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/ADT/STLExtras.h"
125a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/Analysis/ValueTracking.h"
130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h"
140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IRBuilder.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/MDBuilder.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Operator.h"
215a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif#include "gtest/gtest.h"
225a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif
235a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greifnamespace llvm {
245a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greifnamespace {
255a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif
26138acfe353ed8b895de093a4c118b01093b6fbfbGabor GreifTEST(InstructionsTest, ReturnInst) {
275a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif  LLVMContext &C(getGlobalContext());
285a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif
29138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif  // test for PR6589
305a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif  const ReturnInst* r0 = ReturnInst::Create(C);
31d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  EXPECT_EQ(r0->getNumOperands(), 0U);
32138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif  EXPECT_EQ(r0->op_begin(), r0->op_end());
3322385eb8527f6bf8083ee85f85dc51e4d4928aaaGabor Greif
34db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  IntegerType* Int1 = IntegerType::get(C, 1);
3522385eb8527f6bf8083ee85f85dc51e4d4928aaaGabor Greif  Constant* One = ConstantInt::get(Int1, 1, true);
3622385eb8527f6bf8083ee85f85dc51e4d4928aaaGabor Greif  const ReturnInst* r1 = ReturnInst::Create(C, One);
37f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(1U, r1->getNumOperands());
3822385eb8527f6bf8083ee85f85dc51e4d4928aaaGabor Greif  User::const_op_iterator b(r1->op_begin());
39f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_NE(r1->op_end(), b);
40f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(One, *b);
41f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(One, r1->getOperand(0));
4222385eb8527f6bf8083ee85f85dc51e4d4928aaaGabor Greif  ++b;
43f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(r1->op_end(), b);
44642c066906488715220dd87c5b976c67bb8a303dGabor Greif
45642c066906488715220dd87c5b976c67bb8a303dGabor Greif  // clean up
46642c066906488715220dd87c5b976c67bb8a303dGabor Greif  delete r0;
47642c066906488715220dd87c5b976c67bb8a303dGabor Greif  delete r1;
485a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif}
495a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif
50d165e1a71193ebff49ede9663d1ed70050f04699Gabor GreifTEST(InstructionsTest, BranchInst) {
51d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  LLVMContext &C(getGlobalContext());
52d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
53d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // Make a BasicBlocks
54d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  BasicBlock* bb0 = BasicBlock::Create(C);
55d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  BasicBlock* bb1 = BasicBlock::Create(C);
56d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
57d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // Mandatory BranchInst
58d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  const BranchInst* b0 = BranchInst::Create(bb0);
59d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
60abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif  EXPECT_TRUE(b0->isUnconditional());
61abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif  EXPECT_FALSE(b0->isConditional());
62f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(1U, b0->getNumSuccessors());
63abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif
64d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // check num operands
65f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(1U, b0->getNumOperands());
66d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
67d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  EXPECT_NE(b0->op_begin(), b0->op_end());
68f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(b0->op_end(), llvm::next(b0->op_begin()));
69abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif
70f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(b0->op_end(), llvm::next(b0->op_begin()));
71d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
72db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  IntegerType* Int1 = IntegerType::get(C, 1);
73d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  Constant* One = ConstantInt::get(Int1, 1, true);
74d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
75d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // Conditional BranchInst
76d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  BranchInst* b1 = BranchInst::Create(bb0, bb1, One);
77d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
78abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif  EXPECT_FALSE(b1->isUnconditional());
79abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif  EXPECT_TRUE(b1->isConditional());
80f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(2U, b1->getNumSuccessors());
81abf657f7e6dbce1bf8e02fce2d602f33d5fc5c2aGabor Greif
82d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // check num operands
83f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(3U, b1->getNumOperands());
84d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
85d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  User::const_op_iterator b(b1->op_begin());
86d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
87d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // check COND
88d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  EXPECT_NE(b, b1->op_end());
89f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(One, *b);
90f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(One, b1->getOperand(0));
91f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(One, b1->getCondition());
92d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  ++b;
93d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
94d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // check ELSE
95f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb1, *b);
96f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb1, b1->getOperand(1));
97f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb1, b1->getSuccessor(1));
98d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  ++b;
99d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
100d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // check THEN
101f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb0, *b);
102f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb0, b1->getOperand(2));
103f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(bb0, b1->getSuccessor(0));
104d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  ++b;
105d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
106f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(b1->op_end(), b);
107d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
108d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  // clean up
109d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  delete b0;
110d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  delete b1;
111d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
112d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  delete bb0;
113d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif  delete bb1;
114d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif}
115d165e1a71193ebff49ede9663d1ed70050f04699Gabor Greif
116607946533d4eb781713b363605c4a241503dbe0eDuncan SandsTEST(InstructionsTest, CastInst) {
117607946533d4eb781713b363605c4a241503dbe0eDuncan Sands  LLVMContext &C(getGlobalContext());
118607946533d4eb781713b363605c4a241503dbe0eDuncan Sands
119db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* Int8Ty = Type::getInt8Ty(C);
120db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* Int64Ty = Type::getInt64Ty(C);
121db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* V8x8Ty = VectorType::get(Int8Ty, 8);
122db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* V8x64Ty = VectorType::get(Int64Ty, 8);
123db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Type* X86MMXTy = Type::getX86_MMXTy(C);
124607946533d4eb781713b363605c4a241503dbe0eDuncan Sands
125117feba971a020653fef3d6d61a16345355b83fdDuncan Sands  const Constant* c8 = Constant::getNullValue(V8x8Ty);
126117feba971a020653fef3d6d61a16345355b83fdDuncan Sands  const Constant* c64 = Constant::getNullValue(V8x64Ty);
127117feba971a020653fef3d6d61a16345355b83fdDuncan Sands
128607946533d4eb781713b363605c4a241503dbe0eDuncan Sands  EXPECT_TRUE(CastInst::isCastable(V8x8Ty, X86MMXTy));
129607946533d4eb781713b363605c4a241503dbe0eDuncan Sands  EXPECT_TRUE(CastInst::isCastable(X86MMXTy, V8x8Ty));
130607946533d4eb781713b363605c4a241503dbe0eDuncan Sands  EXPECT_FALSE(CastInst::isCastable(Int64Ty, X86MMXTy));
131117feba971a020653fef3d6d61a16345355b83fdDuncan Sands  EXPECT_TRUE(CastInst::isCastable(V8x64Ty, V8x8Ty));
132117feba971a020653fef3d6d61a16345355b83fdDuncan Sands  EXPECT_TRUE(CastInst::isCastable(V8x8Ty, V8x64Ty));
133f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(CastInst::Trunc, CastInst::getCastOpcode(c64, true, V8x8Ty, true));
134f5ec9b55e871d326b8917f203711529273e7fa54John McCall  EXPECT_EQ(CastInst::SExt, CastInst::getCastOpcode(c8, true, V8x64Ty, true));
135607946533d4eb781713b363605c4a241503dbe0eDuncan Sands}
136607946533d4eb781713b363605c4a241503dbe0eDuncan Sands
1371608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1381608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1391608769abeb1430dc34f31ffac0d9850f99ae36aNadav RotemTEST(InstructionsTest, VectorGep) {
1401608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  LLVMContext &C(getGlobalContext());
1411608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1421608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  // Type Definitions
1431608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  PointerType *Ptri8Ty = PointerType::get(IntegerType::get(C, 8), 0);
1441608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  PointerType *Ptri32Ty = PointerType::get(IntegerType::get(C, 8), 0);
1451608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1461608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  VectorType *V2xi8PTy = VectorType::get(Ptri8Ty, 2);
1471608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  VectorType *V2xi32PTy = VectorType::get(Ptri32Ty, 2);
1481608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1491608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  // Test different aspects of the vector-of-pointers type
1501608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  // and GEPs which use this type.
1511608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  ConstantInt *Ci32a = ConstantInt::get(C, APInt(32, 1492));
1521608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  ConstantInt *Ci32b = ConstantInt::get(C, APInt(32, 1948));
1531608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  std::vector<Constant*> ConstVa(2, Ci32a);
1541608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  std::vector<Constant*> ConstVb(2, Ci32b);
1551608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Constant *C2xi32a = ConstantVector::get(ConstVa);
1561608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Constant *C2xi32b = ConstantVector::get(ConstVb);
1571608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1581608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *PtrVecA = new IntToPtrInst(C2xi32a, V2xi32PTy);
1591608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *PtrVecB = new IntToPtrInst(C2xi32b, V2xi32PTy);
1601608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1611608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  ICmpInst *ICmp0 = new ICmpInst(ICmpInst::ICMP_SGT, PtrVecA, PtrVecB);
1621608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  ICmpInst *ICmp1 = new ICmpInst(ICmpInst::ICMP_ULT, PtrVecA, PtrVecB);
1631608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_NE(ICmp0, ICmp1); // suppress warning.
1641608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1654802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  BasicBlock* BB0 = BasicBlock::Create(C);
1664802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  // Test InsertAtEnd ICmpInst constructor.
1674802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  ICmpInst *ICmp2 = new ICmpInst(*BB0, ICmpInst::ICMP_SGE, PtrVecA, PtrVecB);
1684802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  EXPECT_NE(ICmp0, ICmp2); // suppress warning.
1694802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov
1701608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *Gep0 = GetElementPtrInst::Create(PtrVecA, C2xi32a);
1711608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *Gep1 = GetElementPtrInst::Create(PtrVecA, C2xi32b);
1721608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *Gep2 = GetElementPtrInst::Create(PtrVecB, C2xi32a);
1731608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *Gep3 = GetElementPtrInst::Create(PtrVecB, C2xi32b);
1741608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1751608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *BTC0 = new BitCastInst(Gep0, V2xi8PTy);
1761608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *BTC1 = new BitCastInst(Gep1, V2xi8PTy);
1771608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *BTC2 = new BitCastInst(Gep2, V2xi8PTy);
1781608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  CastInst *BTC3 = new BitCastInst(Gep3, V2xi8PTy);
1791608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1801608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Value *S0 = BTC0->stripPointerCasts();
1811608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Value *S1 = BTC1->stripPointerCasts();
1821608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Value *S2 = BTC2->stripPointerCasts();
1831608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  Value *S3 = BTC3->stripPointerCasts();
1841608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1851608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_NE(S0, Gep0);
1861608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_NE(S1, Gep1);
1871608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_NE(S2, Gep2);
1881608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_NE(S3, Gep3);
1891608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
1901608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  int64_t Offset;
191791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow  DataLayout TD("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3"
1921608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem                "2:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80"
1931608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem                ":128:128-n8:16:32:64-S128");
1941608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  // Make sure we don't crash
195a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman  GetPointerBaseWithConstantOffset(Gep0, Offset, &TD);
196a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman  GetPointerBaseWithConstantOffset(Gep1, Offset, &TD);
197a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman  GetPointerBaseWithConstantOffset(Gep2, Offset, &TD);
198a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman  GetPointerBaseWithConstantOffset(Gep3, Offset, &TD);
1991608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2001608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  // Gep of Geps
2011608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *GepII0 = GetElementPtrInst::Create(Gep0, C2xi32b);
2021608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *GepII1 = GetElementPtrInst::Create(Gep1, C2xi32a);
2031608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *GepII2 = GetElementPtrInst::Create(Gep2, C2xi32b);
2041608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  GetElementPtrInst *GepII3 = GetElementPtrInst::Create(Gep3, C2xi32a);
2051608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2061608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_EQ(GepII0->getNumIndices(), 1u);
2071608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_EQ(GepII1->getNumIndices(), 1u);
2081608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_EQ(GepII2->getNumIndices(), 1u);
2091608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_EQ(GepII3->getNumIndices(), 1u);
2101608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2111608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_FALSE(GepII0->hasAllZeroIndices());
2121608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_FALSE(GepII1->hasAllZeroIndices());
2131608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_FALSE(GepII2->hasAllZeroIndices());
2141608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  EXPECT_FALSE(GepII3->hasAllZeroIndices());
2151608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2161608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete GepII0;
2171608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete GepII1;
2181608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete GepII2;
2191608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete GepII3;
2201608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2211608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete BTC0;
2221608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete BTC1;
2231608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete BTC2;
2241608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete BTC3;
2251608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2261608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete Gep0;
2271608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete Gep1;
2281608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete Gep2;
2291608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete Gep3;
2301608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2314802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  ICmp2->eraseFromParent();
2324802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov  delete BB0;
2334802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov
2341608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete ICmp0;
2351608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete ICmp1;
2361608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete PtrVecA;
2371608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem  delete PtrVecB;
2381608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem}
2391608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem
2408883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan SandsTEST(InstructionsTest, FPMathOperator) {
2418883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  LLVMContext &Context = getGlobalContext();
2428883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  IRBuilder<> Builder(Context);
2438883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  MDBuilder MDHelper(Context);
2448883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0);
2458883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  MDNode *MD1 = MDHelper.createFPMath(1.0);
2468883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *V1 = Builder.CreateFAdd(I, I, "", MD1);
2478883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  EXPECT_TRUE(isa<FPMathOperator>(V1));
2488883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  FPMathOperator *O1 = cast<FPMathOperator>(V1);
2498883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  EXPECT_EQ(O1->getFPAccuracy(), 1.0);
2508883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  delete V1;
2518883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  delete I;
2528883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands}
2538883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands
254446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
255446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan SandsTEST(InstructionsTest, isEliminableCastPair) {
256446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  LLVMContext &C(getGlobalContext());
257446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
258446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  Type* Int32Ty = Type::getInt32Ty(C);
259446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  Type* Int64Ty = Type::getInt64Ty(C);
260446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  Type* Int64PtrTy = Type::getInt64PtrTy(C);
261446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
262446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  // Source and destination pointers have same size -> bitcast.
263446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
264446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           CastInst::IntToPtr,
265446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int64PtrTy, Int64Ty, Int64PtrTy,
266446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int32Ty, 0, Int32Ty),
267446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands            CastInst::BitCast);
268446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
269446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  // Source and destination pointers have different sizes -> fail.
270446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt,
271446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           CastInst::IntToPtr,
272446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int64PtrTy, Int64Ty, Int64PtrTy,
273446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int32Ty, 0, Int64Ty),
274446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands            0U);
275446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
276446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  // Middle pointer big enough -> bitcast.
277446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
278446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           CastInst::PtrToInt,
279446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int64Ty, Int64PtrTy, Int64Ty,
280446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           0, Int64Ty, 0),
281446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands            CastInst::BitCast);
282446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
283446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  // Middle pointer too small -> fail.
284446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands  EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr,
285446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           CastInst::PtrToInt,
286446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           Int64Ty, Int64PtrTy, Int64Ty,
287446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands                                           0, Int32Ty, 0),
288446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands            0U);
289446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands}
290446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands
2915a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif}  // end anonymous namespace
2925a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif}  // end namespace llvm
293