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 119f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int8Ty = Type::getInt8Ty(C); 120f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int16Ty = Type::getInt16Ty(C); 121f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int32Ty = Type::getInt32Ty(C); 122f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int64Ty = Type::getInt64Ty(C); 123f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V8x8Ty = VectorType::get(Int8Ty, 8); 124f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V8x64Ty = VectorType::get(Int64Ty, 8); 125f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *X86MMXTy = Type::getX86_MMXTy(C); 126f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 127f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *HalfTy = Type::getHalfTy(C); 128f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *FloatTy = Type::getFloatTy(C); 129f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *DoubleTy = Type::getDoubleTy(C); 130f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 131f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int32Ty = VectorType::get(Int32Ty, 2); 132f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int64Ty = VectorType::get(Int64Ty, 2); 133f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V4Int16Ty = VectorType::get(Int16Ty, 4); 134f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 135f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int32PtrTy = PointerType::get(Int32Ty, 0); 136f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int64PtrTy = PointerType::get(Int64Ty, 0); 137f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 138f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int32PtrAS1Ty = PointerType::get(Int32Ty, 1); 139f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *Int64PtrAS1Ty = PointerType::get(Int64Ty, 1); 140f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 141f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int32PtrAS1Ty = VectorType::get(Int32PtrAS1Ty, 2); 142f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int64PtrAS1Ty = VectorType::get(Int64PtrAS1Ty, 2); 143f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V4Int32PtrAS1Ty = VectorType::get(Int32PtrAS1Ty, 4); 144f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V4Int64PtrAS1Ty = VectorType::get(Int64PtrAS1Ty, 4); 145f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 146f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int64PtrTy = VectorType::get(Int64PtrTy, 2); 147f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault Type *V2Int32PtrTy = VectorType::get(Int32PtrTy, 2); 148607946533d4eb781713b363605c4a241503dbe0eDuncan Sands 149117feba971a020653fef3d6d61a16345355b83fdDuncan Sands const Constant* c8 = Constant::getNullValue(V8x8Ty); 150117feba971a020653fef3d6d61a16345355b83fdDuncan Sands const Constant* c64 = Constant::getNullValue(V8x64Ty); 151117feba971a020653fef3d6d61a16345355b83fdDuncan Sands 152485c7fd76b32a69c46782a715682ed8831b0873bMatt Arsenault EXPECT_TRUE(CastInst::isCastable(V8x8Ty, X86MMXTy)); 153485c7fd76b32a69c46782a715682ed8831b0873bMatt Arsenault EXPECT_TRUE(CastInst::isCastable(X86MMXTy, V8x8Ty)); 154485c7fd76b32a69c46782a715682ed8831b0873bMatt Arsenault EXPECT_FALSE(CastInst::isCastable(Int64Ty, X86MMXTy)); 155485c7fd76b32a69c46782a715682ed8831b0873bMatt Arsenault EXPECT_TRUE(CastInst::isCastable(V8x64Ty, V8x8Ty)); 156485c7fd76b32a69c46782a715682ed8831b0873bMatt Arsenault EXPECT_TRUE(CastInst::isCastable(V8x8Ty, V8x64Ty)); 157f5ec9b55e871d326b8917f203711529273e7fa54John McCall EXPECT_EQ(CastInst::Trunc, CastInst::getCastOpcode(c64, true, V8x8Ty, true)); 158f5ec9b55e871d326b8917f203711529273e7fa54John McCall EXPECT_EQ(CastInst::SExt, CastInst::getCastOpcode(c8, true, V8x64Ty, true)); 1591608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 160f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty, X86MMXTy)); 161f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(X86MMXTy, V8x8Ty)); 162f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, X86MMXTy)); 163f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V8x64Ty, V8x8Ty)); 164f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V8x8Ty, V8x64Ty)); 165f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 166f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault // Check address space casts are rejected since we don't know the sizes here 167f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, Int32PtrAS1Ty)); 168f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int32PtrAS1Ty, Int32PtrTy)); 169f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, V2Int32PtrAS1Ty)); 170f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int32PtrTy)); 171f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V2Int64PtrAS1Ty)); 172f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 173f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault // Test mismatched number of elements for pointers 174f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int64PtrAS1Ty)); 175f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V4Int64PtrAS1Ty, V2Int32PtrAS1Ty)); 176f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrAS1Ty, V4Int32PtrAS1Ty)); 177f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int32PtrTy, V2Int32PtrTy)); 178f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int32PtrTy)); 179f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 180f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(Int32PtrTy, Int64PtrTy)); 181f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(DoubleTy, FloatTy)); 182f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(FloatTy, DoubleTy)); 183f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy)); 184f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(FloatTy, FloatTy)); 185f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(FloatTy, Int32Ty)); 186f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(Int16Ty, HalfTy)); 187f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(Int32Ty, FloatTy)); 188f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, Int64Ty)); 189f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 190f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(V2Int32Ty, V4Int16Ty)); 191f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int32Ty, Int64Ty)); 192f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, Int32Ty)); 193f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault 194f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32PtrTy, Int64Ty)); 195f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(Int64Ty, V2Int32PtrTy)); 196f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(V2Int64PtrTy, V2Int32PtrTy)); 197f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_TRUE(CastInst::isBitCastable(V2Int32PtrTy, V2Int64PtrTy)); 198f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int32Ty, V2Int64Ty)); 199f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault EXPECT_FALSE(CastInst::isBitCastable(V2Int64Ty, V2Int32Ty)); 2001bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault 2011bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault 2021bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault // Check that assertion is not hit when creating a cast with a vector of 2031bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault // pointers 2041bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault // First form 2051bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault BasicBlock *BB = BasicBlock::Create(C); 2061bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault Constant *NullV2I32Ptr = Constant::getNullValue(V2Int32PtrTy); 2071bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty, "foo", BB); 2081bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault 2091bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault // Second form 2101bf0ec4e1642a532c0121de8ccc0878d6403c9d3Matt Arsenault CastInst::CreatePointerCast(NullV2I32Ptr, V2Int32Ty); 211f34dc428fa577d6d5d71ab3a1f9765b4e5da5a4fMatt Arsenault} 2121608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2131608769abeb1430dc34f31ffac0d9850f99ae36aNadav RotemTEST(InstructionsTest, VectorGep) { 2141608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem LLVMContext &C(getGlobalContext()); 2151608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2161608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem // Type Definitions 2171608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem PointerType *Ptri8Ty = PointerType::get(IntegerType::get(C, 8), 0); 21876bf61fe0754500c5c9d01fc440ff36c76ff61f5Matt Arsenault PointerType *Ptri32Ty = PointerType::get(IntegerType::get(C, 32), 0); 2191608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2201608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem VectorType *V2xi8PTy = VectorType::get(Ptri8Ty, 2); 2211608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem VectorType *V2xi32PTy = VectorType::get(Ptri32Ty, 2); 2221608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2231608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem // Test different aspects of the vector-of-pointers type 2241608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem // and GEPs which use this type. 2251608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem ConstantInt *Ci32a = ConstantInt::get(C, APInt(32, 1492)); 2261608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem ConstantInt *Ci32b = ConstantInt::get(C, APInt(32, 1948)); 2271608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem std::vector<Constant*> ConstVa(2, Ci32a); 2281608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem std::vector<Constant*> ConstVb(2, Ci32b); 2291608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Constant *C2xi32a = ConstantVector::get(ConstVa); 2301608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Constant *C2xi32b = ConstantVector::get(ConstVb); 2311608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2321608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *PtrVecA = new IntToPtrInst(C2xi32a, V2xi32PTy); 2331608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *PtrVecB = new IntToPtrInst(C2xi32b, V2xi32PTy); 2341608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2351608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem ICmpInst *ICmp0 = new ICmpInst(ICmpInst::ICMP_SGT, PtrVecA, PtrVecB); 2361608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem ICmpInst *ICmp1 = new ICmpInst(ICmpInst::ICMP_ULT, PtrVecA, PtrVecB); 2371608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_NE(ICmp0, ICmp1); // suppress warning. 2381608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2394802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov BasicBlock* BB0 = BasicBlock::Create(C); 2404802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov // Test InsertAtEnd ICmpInst constructor. 2414802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov ICmpInst *ICmp2 = new ICmpInst(*BB0, ICmpInst::ICMP_SGE, PtrVecA, PtrVecB); 2424802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov EXPECT_NE(ICmp0, ICmp2); // suppress warning. 2434802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov 2441608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *Gep0 = GetElementPtrInst::Create(PtrVecA, C2xi32a); 2451608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *Gep1 = GetElementPtrInst::Create(PtrVecA, C2xi32b); 2461608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *Gep2 = GetElementPtrInst::Create(PtrVecB, C2xi32a); 2471608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *Gep3 = GetElementPtrInst::Create(PtrVecB, C2xi32b); 2481608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2491608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *BTC0 = new BitCastInst(Gep0, V2xi8PTy); 2501608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *BTC1 = new BitCastInst(Gep1, V2xi8PTy); 2511608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *BTC2 = new BitCastInst(Gep2, V2xi8PTy); 2521608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem CastInst *BTC3 = new BitCastInst(Gep3, V2xi8PTy); 2531608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2541608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Value *S0 = BTC0->stripPointerCasts(); 2551608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Value *S1 = BTC1->stripPointerCasts(); 2561608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Value *S2 = BTC2->stripPointerCasts(); 2571608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem Value *S3 = BTC3->stripPointerCasts(); 2581608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2591608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_NE(S0, Gep0); 2601608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_NE(S1, Gep1); 2611608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_NE(S2, Gep2); 2621608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_NE(S3, Gep3); 2631608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2641608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem int64_t Offset; 265791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow DataLayout TD("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3" 2661608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem "2:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80" 2671608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem ":128:128-n8:16:32:64-S128"); 2681608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem // Make sure we don't crash 269a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman GetPointerBaseWithConstantOffset(Gep0, Offset, &TD); 270a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman GetPointerBaseWithConstantOffset(Gep1, Offset, &TD); 271a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman GetPointerBaseWithConstantOffset(Gep2, Offset, &TD); 272a070d2a0355c4993240b5206ebc1d517c151331dDan Gohman GetPointerBaseWithConstantOffset(Gep3, Offset, &TD); 2731608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2741608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem // Gep of Geps 2751608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *GepII0 = GetElementPtrInst::Create(Gep0, C2xi32b); 2761608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *GepII1 = GetElementPtrInst::Create(Gep1, C2xi32a); 2771608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *GepII2 = GetElementPtrInst::Create(Gep2, C2xi32b); 2781608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem GetElementPtrInst *GepII3 = GetElementPtrInst::Create(Gep3, C2xi32a); 2791608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2801608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_EQ(GepII0->getNumIndices(), 1u); 2811608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_EQ(GepII1->getNumIndices(), 1u); 2821608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_EQ(GepII2->getNumIndices(), 1u); 2831608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_EQ(GepII3->getNumIndices(), 1u); 2841608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2851608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_FALSE(GepII0->hasAllZeroIndices()); 2861608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_FALSE(GepII1->hasAllZeroIndices()); 2871608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_FALSE(GepII2->hasAllZeroIndices()); 2881608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem EXPECT_FALSE(GepII3->hasAllZeroIndices()); 2891608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2901608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete GepII0; 2911608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete GepII1; 2921608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete GepII2; 2931608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete GepII3; 2941608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 2951608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete BTC0; 2961608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete BTC1; 2971608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete BTC2; 2981608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete BTC3; 2991608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 3001608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete Gep0; 3011608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete Gep1; 3021608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete Gep2; 3031608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete Gep3; 3041608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 3054802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov ICmp2->eraseFromParent(); 3064802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov delete BB0; 3074802b9d6dc7443985066f0381c0a2468f72f9b81Evgeniy Stepanov 3081608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete ICmp0; 3091608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete ICmp1; 3101608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete PtrVecA; 3111608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem delete PtrVecB; 3121608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem} 3131608769abeb1430dc34f31ffac0d9850f99ae36aNadav Rotem 3148883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan SandsTEST(InstructionsTest, FPMathOperator) { 3158883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands LLVMContext &Context = getGlobalContext(); 3168883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands IRBuilder<> Builder(Context); 3178883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands MDBuilder MDHelper(Context); 3188883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands Instruction *I = Builder.CreatePHI(Builder.getDoubleTy(), 0); 3198883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands MDNode *MD1 = MDHelper.createFPMath(1.0); 3208883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands Value *V1 = Builder.CreateFAdd(I, I, "", MD1); 3218883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands EXPECT_TRUE(isa<FPMathOperator>(V1)); 3228883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands FPMathOperator *O1 = cast<FPMathOperator>(V1); 3238883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands EXPECT_EQ(O1->getFPAccuracy(), 1.0); 3248883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands delete V1; 3258883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands delete I; 3268883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands} 3278883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands 328446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 329446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan SandsTEST(InstructionsTest, isEliminableCastPair) { 330446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands LLVMContext &C(getGlobalContext()); 331446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 3323181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Type* Int16Ty = Type::getInt16Ty(C); 333446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Type* Int32Ty = Type::getInt32Ty(C); 334446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Type* Int64Ty = Type::getInt64Ty(C); 335446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Type* Int64PtrTy = Type::getInt64PtrTy(C); 336446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 337446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands // Source and destination pointers have same size -> bitcast. 338446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt, 339446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::IntToPtr, 340446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Int64PtrTy, Int64Ty, Int64PtrTy, 341446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Int32Ty, 0, Int32Ty), 342446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::BitCast); 343446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 3443181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Source and destination have unknown sizes, but the same address space and 3453181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // the intermediate int is the maximum pointer size -> bitcast 346446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt, 347446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::IntToPtr, 348446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Int64PtrTy, Int64Ty, Int64PtrTy, 3493181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 3503181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::BitCast); 3513181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3523181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Source and destination have unknown sizes, but the same address space and 3533181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // the intermediate int is not the maximum pointer size -> nothing 3543181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::PtrToInt, 3553181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::IntToPtr, 3563181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int64PtrTy, Int32Ty, Int64PtrTy, 3573181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 358446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 0U); 359446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 360446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands // Middle pointer big enough -> bitcast. 361446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr, 362446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::PtrToInt, 363446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Int64Ty, Int64PtrTy, Int64Ty, 364446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 0, Int64Ty, 0), 365446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::BitCast); 366446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 367446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands // Middle pointer too small -> fail. 368446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr, 369446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands CastInst::PtrToInt, 370446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands Int64Ty, Int64PtrTy, Int64Ty, 371446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 0, Int32Ty, 0), 372446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 0U); 3733181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3743181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3753181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Test that we don't eliminate bitcasts between different address spaces, 3763181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // or if we don't have available pointer size information. 3773181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault DataLayout DL("e-p:32:32:32-p1:16:16:16-p2:64:64:64-i1:8:8-i8:8:8-i16:16:16" 3783181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64" 3793181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault "-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"); 3803181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3813181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Type* Int64PtrTyAS1 = Type::getInt64PtrTy(C, 1); 3823181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Type* Int64PtrTyAS2 = Type::getInt64PtrTy(C, 2); 3833181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3843181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault IntegerType *Int16SizePtr = DL.getIntPtrType(C, 1); 3853181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault IntegerType *Int64SizePtr = DL.getIntPtrType(C, 2); 3863181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3873181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Fail since the ptr int types are not provided 3883181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr, 3893181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::BitCast, 3903181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int16Ty, Int64PtrTyAS1, Int64PtrTyAS2, 3913181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 3923181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0U); 3933181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 3943181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Fail since the the bitcast is between different sized address spaces 3953181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair( 3963181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::IntToPtr, 3973181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::BitCast, 3983181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int16Ty, Int64PtrTyAS1, Int64PtrTyAS2, 3993181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, Int16SizePtr, Int64SizePtr), 4003181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0U); 4013181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4023181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Fail since the the bitcast is between different sized address spaces 4033181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr, 4043181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::BitCast, 4053181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int16Ty, Int64PtrTyAS1, Int64PtrTyAS2, 4063181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, Int16SizePtr, Int64SizePtr), 4073181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0U); 4083181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4093181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Pass since the bitcast address spaces are the same 4103181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::IntToPtr, 4113181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::BitCast, 4123181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int16Ty, Int64PtrTyAS1, Int64PtrTyAS1, 4133181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 4143181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::IntToPtr); 4153181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4163181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4173181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Fail without known pointer sizes and different address spaces 4183181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::BitCast, 4193181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::PtrToInt, 4203181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int64PtrTyAS1, Int64PtrTyAS2, Int16Ty, 4213181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 4223181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0U); 4233181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4243181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Pass since the address spaces are the same, even though the pointer sizes 4253181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // are unknown 4263181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::BitCast, 4273181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::PtrToInt, 4283181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int64PtrTyAS1, Int64PtrTyAS1, Int32Ty, 4293181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0, 0, 0), 4303181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Instruction::PtrToInt); 4313181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4323181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault // Fail since the bitcast is the wrong size 4333181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault EXPECT_EQ(CastInst::isEliminableCastPair(CastInst::BitCast, 4343181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault CastInst::PtrToInt, 4353181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int64PtrTyAS1, Int64PtrTyAS2, Int64Ty, 4363181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault Int16SizePtr, Int64SizePtr, 0), 4373181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 0U); 438446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands} 439446cf94cdbbc1f8e22452fc46664ac73d810c6a2Duncan Sands 4405a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif} // end anonymous namespace 4415a7069a80fee26490b201cb3d88eb124585bd6c8Gabor Greif} // end namespace llvm 4423181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 4433181f5900ff5d9800c38284c7d3427cb6e306c9aMatt Arsenault 444