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