1 //===- llvm/unittest/IR/ConstantsTest.cpp - Constants unit tests ----------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/IR/Constants.h"
11 #include "llvm-c/Core.h"
12 #include "llvm/AsmParser/Parser.h"
13 #include "llvm/IR/DerivedTypes.h"
14 #include "llvm/IR/InstrTypes.h"
15 #include "llvm/IR/Instruction.h"
16 #include "llvm/IR/LLVMContext.h"
17 #include "llvm/IR/Module.h"
18 #include "llvm/Support/SourceMgr.h"
19 #include "gtest/gtest.h"
24 TEST(ConstantsTest
, Integer_i1
) {
26 IntegerType
*Int1
= IntegerType::get(Context
, 1);
27 Constant
* One
= ConstantInt::get(Int1
, 1, true);
28 Constant
* Zero
= ConstantInt::get(Int1
, 0);
29 Constant
* NegOne
= ConstantInt::get(Int1
, static_cast<uint64_t>(-1), true);
30 EXPECT_EQ(NegOne
, ConstantInt::getSigned(Int1
, -1));
31 Constant
* Undef
= UndefValue::get(Int1
);
33 // Input: @b = constant i1 add(i1 1 , i1 1)
34 // Output: @b = constant i1 false
35 EXPECT_EQ(Zero
, ConstantExpr::getAdd(One
, One
));
37 // @c = constant i1 add(i1 -1, i1 1)
38 // @c = constant i1 false
39 EXPECT_EQ(Zero
, ConstantExpr::getAdd(NegOne
, One
));
41 // @d = constant i1 add(i1 -1, i1 -1)
42 // @d = constant i1 false
43 EXPECT_EQ(Zero
, ConstantExpr::getAdd(NegOne
, NegOne
));
45 // @e = constant i1 sub(i1 -1, i1 1)
46 // @e = constant i1 false
47 EXPECT_EQ(Zero
, ConstantExpr::getSub(NegOne
, One
));
49 // @f = constant i1 sub(i1 1 , i1 -1)
50 // @f = constant i1 false
51 EXPECT_EQ(Zero
, ConstantExpr::getSub(One
, NegOne
));
53 // @g = constant i1 sub(i1 1 , i1 1)
54 // @g = constant i1 false
55 EXPECT_EQ(Zero
, ConstantExpr::getSub(One
, One
));
57 // @h = constant i1 shl(i1 1 , i1 1) ; undefined
58 // @h = constant i1 undef
59 EXPECT_EQ(Undef
, ConstantExpr::getShl(One
, One
));
61 // @i = constant i1 shl(i1 1 , i1 0)
62 // @i = constant i1 true
63 EXPECT_EQ(One
, ConstantExpr::getShl(One
, Zero
));
65 // @j = constant i1 lshr(i1 1, i1 1) ; undefined
66 // @j = constant i1 undef
67 EXPECT_EQ(Undef
, ConstantExpr::getLShr(One
, One
));
69 // @m = constant i1 ashr(i1 1, i1 1) ; undefined
70 // @m = constant i1 undef
71 EXPECT_EQ(Undef
, ConstantExpr::getAShr(One
, One
));
73 // @n = constant i1 mul(i1 -1, i1 1)
74 // @n = constant i1 true
75 EXPECT_EQ(One
, ConstantExpr::getMul(NegOne
, One
));
77 // @o = constant i1 sdiv(i1 -1, i1 1) ; overflow
78 // @o = constant i1 true
79 EXPECT_EQ(One
, ConstantExpr::getSDiv(NegOne
, One
));
81 // @p = constant i1 sdiv(i1 1 , i1 -1); overflow
82 // @p = constant i1 true
83 EXPECT_EQ(One
, ConstantExpr::getSDiv(One
, NegOne
));
85 // @q = constant i1 udiv(i1 -1, i1 1)
86 // @q = constant i1 true
87 EXPECT_EQ(One
, ConstantExpr::getUDiv(NegOne
, One
));
89 // @r = constant i1 udiv(i1 1, i1 -1)
90 // @r = constant i1 true
91 EXPECT_EQ(One
, ConstantExpr::getUDiv(One
, NegOne
));
93 // @s = constant i1 srem(i1 -1, i1 1) ; overflow
94 // @s = constant i1 false
95 EXPECT_EQ(Zero
, ConstantExpr::getSRem(NegOne
, One
));
97 // @t = constant i1 urem(i1 -1, i1 1)
98 // @t = constant i1 false
99 EXPECT_EQ(Zero
, ConstantExpr::getURem(NegOne
, One
));
101 // @u = constant i1 srem(i1 1, i1 -1) ; overflow
102 // @u = constant i1 false
103 EXPECT_EQ(Zero
, ConstantExpr::getSRem(One
, NegOne
));
106 TEST(ConstantsTest
, IntSigns
) {
108 IntegerType
*Int8Ty
= Type::getInt8Ty(Context
);
109 EXPECT_EQ(100, ConstantInt::get(Int8Ty
, 100, false)->getSExtValue());
110 EXPECT_EQ(100, ConstantInt::get(Int8Ty
, 100, true)->getSExtValue());
111 EXPECT_EQ(100, ConstantInt::getSigned(Int8Ty
, 100)->getSExtValue());
112 EXPECT_EQ(-50, ConstantInt::get(Int8Ty
, 206)->getSExtValue());
113 EXPECT_EQ(-50, ConstantInt::getSigned(Int8Ty
, -50)->getSExtValue());
114 EXPECT_EQ(206U, ConstantInt::getSigned(Int8Ty
, -50)->getZExtValue());
116 // Overflow is handled by truncation.
117 EXPECT_EQ(0x3b, ConstantInt::get(Int8Ty
, 0x13b)->getSExtValue());
120 TEST(ConstantsTest
, FP128Test
) {
122 Type
*FP128Ty
= Type::getFP128Ty(Context
);
124 IntegerType
*Int128Ty
= Type::getIntNTy(Context
, 128);
125 Constant
*Zero128
= Constant::getNullValue(Int128Ty
);
126 Constant
*X
= ConstantExpr::getUIToFP(Zero128
, FP128Ty
);
127 EXPECT_TRUE(isa
<ConstantFP
>(X
));
130 TEST(ConstantsTest
, PointerCast
) {
132 Type
*Int8PtrTy
= Type::getInt8PtrTy(C
);
133 Type
*Int32PtrTy
= Type::getInt32PtrTy(C
);
134 Type
*Int64Ty
= Type::getInt64Ty(C
);
135 VectorType
*Int8PtrVecTy
= VectorType::get(Int8PtrTy
, 4);
136 VectorType
*Int32PtrVecTy
= VectorType::get(Int32PtrTy
, 4);
137 VectorType
*Int64VecTy
= VectorType::get(Int64Ty
, 4);
139 // ptrtoint i8* to i64
140 EXPECT_EQ(Constant::getNullValue(Int64Ty
),
141 ConstantExpr::getPointerCast(
142 Constant::getNullValue(Int8PtrTy
), Int64Ty
));
144 // bitcast i8* to i32*
145 EXPECT_EQ(Constant::getNullValue(Int32PtrTy
),
146 ConstantExpr::getPointerCast(
147 Constant::getNullValue(Int8PtrTy
), Int32PtrTy
));
149 // ptrtoint <4 x i8*> to <4 x i64>
150 EXPECT_EQ(Constant::getNullValue(Int64VecTy
),
151 ConstantExpr::getPointerCast(
152 Constant::getNullValue(Int8PtrVecTy
), Int64VecTy
));
154 // bitcast <4 x i8*> to <4 x i32*>
155 EXPECT_EQ(Constant::getNullValue(Int32PtrVecTy
),
156 ConstantExpr::getPointerCast(
157 Constant::getNullValue(Int8PtrVecTy
), Int32PtrVecTy
));
159 Type
*Int32Ptr1Ty
= Type::getInt32PtrTy(C
, 1);
160 ConstantInt
*K
= ConstantInt::get(Type::getInt64Ty(C
), 1234);
162 // Make sure that addrspacecast of inttoptr is not folded away.
164 ConstantExpr::getAddrSpaceCast(
165 ConstantExpr::getIntToPtr(K
, Int32PtrTy
), Int32Ptr1Ty
));
167 ConstantExpr::getAddrSpaceCast(
168 ConstantExpr::getIntToPtr(K
, Int32Ptr1Ty
), Int32PtrTy
));
170 Constant
*NullInt32Ptr0
= Constant::getNullValue(Int32PtrTy
);
171 Constant
*NullInt32Ptr1
= Constant::getNullValue(Int32Ptr1Ty
);
173 // Make sure that addrspacecast of null is not folded away.
174 EXPECT_NE(Constant::getNullValue(Int32PtrTy
),
175 ConstantExpr::getAddrSpaceCast(NullInt32Ptr0
, Int32Ptr1Ty
));
177 EXPECT_NE(Constant::getNullValue(Int32Ptr1Ty
),
178 ConstantExpr::getAddrSpaceCast(NullInt32Ptr1
, Int32PtrTy
));
181 #define CHECK(x, y) \
184 raw_string_ostream __o(__s); \
185 Instruction *__I = cast<ConstantExpr>(x)->getAsInstruction(); \
187 __I->deleteValue(); \
189 EXPECT_EQ(std::string(" <badref> = " y), __s); \
192 TEST(ConstantsTest
, AsInstructionsTest
) {
194 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
196 Type
*Int64Ty
= Type::getInt64Ty(Context
);
197 Type
*Int32Ty
= Type::getInt32Ty(Context
);
198 Type
*Int16Ty
= Type::getInt16Ty(Context
);
199 Type
*Int1Ty
= Type::getInt1Ty(Context
);
200 Type
*FloatTy
= Type::getFloatTy(Context
);
201 Type
*DoubleTy
= Type::getDoubleTy(Context
);
203 Constant
*Global
= M
->getOrInsertGlobal("dummy",
204 PointerType::getUnqual(Int32Ty
));
205 Constant
*Global2
= M
->getOrInsertGlobal("dummy2",
206 PointerType::getUnqual(Int32Ty
));
208 Constant
*P0
= ConstantExpr::getPtrToInt(Global
, Int32Ty
);
209 Constant
*P1
= ConstantExpr::getUIToFP(P0
, FloatTy
);
210 Constant
*P2
= ConstantExpr::getUIToFP(P0
, DoubleTy
);
211 Constant
*P3
= ConstantExpr::getTrunc(P0
, Int1Ty
);
212 Constant
*P4
= ConstantExpr::getPtrToInt(Global2
, Int32Ty
);
213 Constant
*P5
= ConstantExpr::getUIToFP(P4
, FloatTy
);
214 Constant
*P6
= ConstantExpr::getBitCast(P4
, VectorType::get(Int16Ty
, 2));
216 Constant
*One
= ConstantInt::get(Int32Ty
, 1);
217 Constant
*Two
= ConstantInt::get(Int64Ty
, 2);
218 Constant
*Big
= ConstantInt::get(Context
, APInt
{256, uint64_t(-1), true});
219 Constant
*Elt
= ConstantInt::get(Int16Ty
, 2015);
220 Constant
*Undef16
= UndefValue::get(Int16Ty
);
221 Constant
*Undef64
= UndefValue::get(Int64Ty
);
222 Constant
*UndefV16
= UndefValue::get(P6
->getType());
224 #define P0STR "ptrtoint (i32** @dummy to i32)"
225 #define P1STR "uitofp (i32 ptrtoint (i32** @dummy to i32) to float)"
226 #define P2STR "uitofp (i32 ptrtoint (i32** @dummy to i32) to double)"
227 #define P3STR "ptrtoint (i32** @dummy to i1)"
228 #define P4STR "ptrtoint (i32** @dummy2 to i32)"
229 #define P5STR "uitofp (i32 ptrtoint (i32** @dummy2 to i32) to float)"
230 #define P6STR "bitcast (i32 ptrtoint (i32** @dummy2 to i32) to <2 x i16>)"
232 CHECK(ConstantExpr::getNeg(P0
), "sub i32 0, " P0STR
);
233 CHECK(ConstantExpr::getFNeg(P1
), "fsub float -0.000000e+00, " P1STR
);
234 CHECK(ConstantExpr::getNot(P0
), "xor i32 " P0STR
", -1");
235 CHECK(ConstantExpr::getAdd(P0
, P0
), "add i32 " P0STR
", " P0STR
);
236 CHECK(ConstantExpr::getAdd(P0
, P0
, false, true), "add nsw i32 " P0STR
", "
238 CHECK(ConstantExpr::getAdd(P0
, P0
, true, true), "add nuw nsw i32 " P0STR
", "
240 CHECK(ConstantExpr::getFAdd(P1
, P1
), "fadd float " P1STR
", " P1STR
);
241 CHECK(ConstantExpr::getSub(P0
, P0
), "sub i32 " P0STR
", " P0STR
);
242 CHECK(ConstantExpr::getFSub(P1
, P1
), "fsub float " P1STR
", " P1STR
);
243 CHECK(ConstantExpr::getMul(P0
, P0
), "mul i32 " P0STR
", " P0STR
);
244 CHECK(ConstantExpr::getFMul(P1
, P1
), "fmul float " P1STR
", " P1STR
);
245 CHECK(ConstantExpr::getUDiv(P0
, P0
), "udiv i32 " P0STR
", " P0STR
);
246 CHECK(ConstantExpr::getSDiv(P0
, P0
), "sdiv i32 " P0STR
", " P0STR
);
247 CHECK(ConstantExpr::getFDiv(P1
, P1
), "fdiv float " P1STR
", " P1STR
);
248 CHECK(ConstantExpr::getURem(P0
, P0
), "urem i32 " P0STR
", " P0STR
);
249 CHECK(ConstantExpr::getSRem(P0
, P0
), "srem i32 " P0STR
", " P0STR
);
250 CHECK(ConstantExpr::getFRem(P1
, P1
), "frem float " P1STR
", " P1STR
);
251 CHECK(ConstantExpr::getAnd(P0
, P0
), "and i32 " P0STR
", " P0STR
);
252 CHECK(ConstantExpr::getOr(P0
, P0
), "or i32 " P0STR
", " P0STR
);
253 CHECK(ConstantExpr::getXor(P0
, P0
), "xor i32 " P0STR
", " P0STR
);
254 CHECK(ConstantExpr::getShl(P0
, P0
), "shl i32 " P0STR
", " P0STR
);
255 CHECK(ConstantExpr::getShl(P0
, P0
, true), "shl nuw i32 " P0STR
", " P0STR
);
256 CHECK(ConstantExpr::getShl(P0
, P0
, false, true), "shl nsw i32 " P0STR
", "
258 CHECK(ConstantExpr::getLShr(P0
, P0
, false), "lshr i32 " P0STR
", " P0STR
);
259 CHECK(ConstantExpr::getLShr(P0
, P0
, true), "lshr exact i32 " P0STR
", " P0STR
);
260 CHECK(ConstantExpr::getAShr(P0
, P0
, false), "ashr i32 " P0STR
", " P0STR
);
261 CHECK(ConstantExpr::getAShr(P0
, P0
, true), "ashr exact i32 " P0STR
", " P0STR
);
263 CHECK(ConstantExpr::getSExt(P0
, Int64Ty
), "sext i32 " P0STR
" to i64");
264 CHECK(ConstantExpr::getZExt(P0
, Int64Ty
), "zext i32 " P0STR
" to i64");
265 CHECK(ConstantExpr::getFPTrunc(P2
, FloatTy
), "fptrunc double " P2STR
267 CHECK(ConstantExpr::getFPExtend(P1
, DoubleTy
), "fpext float " P1STR
270 CHECK(ConstantExpr::getExactUDiv(P0
, P0
), "udiv exact i32 " P0STR
", " P0STR
);
272 CHECK(ConstantExpr::getSelect(P3
, P0
, P4
), "select i1 " P3STR
", i32 " P0STR
274 CHECK(ConstantExpr::getICmp(CmpInst::ICMP_EQ
, P0
, P4
), "icmp eq i32 " P0STR
276 CHECK(ConstantExpr::getFCmp(CmpInst::FCMP_ULT
, P1
, P5
), "fcmp ult float "
279 std::vector
<Constant
*> V
;
281 // FIXME: getGetElementPtr() actually creates an inbounds ConstantGEP,
283 //CHECK(ConstantExpr::getGetElementPtr(Global, V, false),
284 // "getelementptr i32*, i32** @dummy, i32 1");
285 CHECK(ConstantExpr::getInBoundsGetElementPtr(PointerType::getUnqual(Int32Ty
),
287 "getelementptr inbounds i32*, i32** @dummy, i32 1");
289 CHECK(ConstantExpr::getExtractElement(P6
, One
), "extractelement <2 x i16> "
292 EXPECT_EQ(Undef16
, ConstantExpr::getExtractElement(P6
, Two
));
293 EXPECT_EQ(Undef16
, ConstantExpr::getExtractElement(P6
, Big
));
294 EXPECT_EQ(Undef16
, ConstantExpr::getExtractElement(P6
, Undef64
));
296 EXPECT_EQ(Elt
, ConstantExpr::getExtractElement(
297 ConstantExpr::getInsertElement(P6
, Elt
, One
), One
));
298 EXPECT_EQ(UndefV16
, ConstantExpr::getInsertElement(P6
, Elt
, Two
));
299 EXPECT_EQ(UndefV16
, ConstantExpr::getInsertElement(P6
, Elt
, Big
));
300 EXPECT_EQ(UndefV16
, ConstantExpr::getInsertElement(P6
, Elt
, Undef64
));
303 #ifdef GTEST_HAS_DEATH_TEST
305 TEST(ConstantsTest
, ReplaceWithConstantTest
) {
307 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
309 Type
*Int32Ty
= Type::getInt32Ty(Context
);
310 Constant
*One
= ConstantInt::get(Int32Ty
, 1);
313 M
->getOrInsertGlobal("dummy", PointerType::getUnqual(Int32Ty
));
314 Constant
*GEP
= ConstantExpr::getGetElementPtr(
315 PointerType::getUnqual(Int32Ty
), Global
, One
);
316 EXPECT_DEATH(Global
->replaceAllUsesWith(GEP
),
317 "this->replaceAllUsesWith\\(expr\\(this\\)\\) is NOT valid!");
325 TEST(ConstantsTest
, ConstantArrayReplaceWithConstant
) {
327 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
329 Type
*IntTy
= Type::getInt8Ty(Context
);
330 ArrayType
*ArrayTy
= ArrayType::get(IntTy
, 2);
331 Constant
*A01Vals
[2] = {ConstantInt::get(IntTy
, 0),
332 ConstantInt::get(IntTy
, 1)};
333 Constant
*A01
= ConstantArray::get(ArrayTy
, A01Vals
);
335 Constant
*Global
= new GlobalVariable(*M
, IntTy
, false,
336 GlobalValue::ExternalLinkage
, nullptr);
337 Constant
*GlobalInt
= ConstantExpr::getPtrToInt(Global
, IntTy
);
338 Constant
*A0GVals
[2] = {ConstantInt::get(IntTy
, 0), GlobalInt
};
339 Constant
*A0G
= ConstantArray::get(ArrayTy
, A0GVals
);
342 GlobalVariable
*RefArray
=
343 new GlobalVariable(*M
, ArrayTy
, false, GlobalValue::ExternalLinkage
, A0G
);
344 ASSERT_EQ(A0G
, RefArray
->getInitializer());
346 GlobalInt
->replaceAllUsesWith(ConstantInt::get(IntTy
, 1));
347 ASSERT_EQ(A01
, RefArray
->getInitializer());
350 TEST(ConstantsTest
, ConstantExprReplaceWithConstant
) {
352 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
354 Type
*IntTy
= Type::getInt8Ty(Context
);
355 Constant
*G1
= new GlobalVariable(*M
, IntTy
, false,
356 GlobalValue::ExternalLinkage
, nullptr);
357 Constant
*G2
= new GlobalVariable(*M
, IntTy
, false,
358 GlobalValue::ExternalLinkage
, nullptr);
361 Constant
*Int1
= ConstantExpr::getPtrToInt(G1
, IntTy
);
362 Constant
*Int2
= ConstantExpr::getPtrToInt(G2
, IntTy
);
363 ASSERT_NE(Int1
, Int2
);
365 GlobalVariable
*Ref
=
366 new GlobalVariable(*M
, IntTy
, false, GlobalValue::ExternalLinkage
, Int1
);
367 ASSERT_EQ(Int1
, Ref
->getInitializer());
369 G1
->replaceAllUsesWith(G2
);
370 ASSERT_EQ(Int2
, Ref
->getInitializer());
373 TEST(ConstantsTest
, GEPReplaceWithConstant
) {
375 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
377 Type
*IntTy
= Type::getInt32Ty(Context
);
378 Type
*PtrTy
= PointerType::get(IntTy
, 0);
379 auto *C1
= ConstantInt::get(IntTy
, 1);
380 auto *Placeholder
= new GlobalVariable(
381 *M
, IntTy
, false, GlobalValue::ExternalWeakLinkage
, nullptr);
382 auto *GEP
= ConstantExpr::getGetElementPtr(IntTy
, Placeholder
, C1
);
383 ASSERT_EQ(GEP
->getOperand(0), Placeholder
);
386 new GlobalVariable(*M
, PtrTy
, false, GlobalValue::ExternalLinkage
, GEP
);
387 ASSERT_EQ(GEP
, Ref
->getInitializer());
389 auto *Global
= new GlobalVariable(*M
, PtrTy
, false,
390 GlobalValue::ExternalLinkage
, nullptr);
391 auto *Alias
= GlobalAlias::create(IntTy
, 0, GlobalValue::ExternalLinkage
,
392 "alias", Global
, M
.get());
393 Placeholder
->replaceAllUsesWith(Alias
);
394 ASSERT_EQ(GEP
, Ref
->getInitializer());
395 ASSERT_EQ(GEP
->getOperand(0), Alias
);
398 TEST(ConstantsTest
, AliasCAPI
) {
401 std::unique_ptr
<Module
> M
=
402 parseAssemblyString("@g = global i32 42", Error
, Context
);
403 GlobalVariable
*G
= M
->getGlobalVariable("g");
404 Type
*I16Ty
= Type::getInt16Ty(Context
);
405 Type
*I16PTy
= PointerType::get(I16Ty
, 0);
406 Constant
*Aliasee
= ConstantExpr::getBitCast(G
, I16PTy
);
407 LLVMValueRef AliasRef
=
408 LLVMAddAlias(wrap(M
.get()), wrap(I16PTy
), wrap(Aliasee
), "a");
409 ASSERT_EQ(unwrap
<GlobalAlias
>(AliasRef
)->getAliasee(), Aliasee
);
412 static std::string
getNameOfType(Type
*T
) {
414 raw_string_ostream
RSOS(S
);
419 TEST(ConstantsTest
, BuildConstantDataArrays
) {
421 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
423 for (Type
*T
: {Type::getInt8Ty(Context
), Type::getInt16Ty(Context
),
424 Type::getInt32Ty(Context
), Type::getInt64Ty(Context
)}) {
425 ArrayType
*ArrayTy
= ArrayType::get(T
, 2);
426 Constant
*Vals
[] = {ConstantInt::get(T
, 0), ConstantInt::get(T
, 1)};
427 Constant
*CDV
= ConstantArray::get(ArrayTy
, Vals
);
428 ASSERT_TRUE(dyn_cast
<ConstantDataArray
>(CDV
) != nullptr)
429 << " T = " << getNameOfType(T
);
432 for (Type
*T
: {Type::getHalfTy(Context
), Type::getFloatTy(Context
),
433 Type::getDoubleTy(Context
)}) {
434 ArrayType
*ArrayTy
= ArrayType::get(T
, 2);
435 Constant
*Vals
[] = {ConstantFP::get(T
, 0), ConstantFP::get(T
, 1)};
436 Constant
*CDV
= ConstantArray::get(ArrayTy
, Vals
);
437 ASSERT_TRUE(dyn_cast
<ConstantDataArray
>(CDV
) != nullptr)
438 << " T = " << getNameOfType(T
);
442 TEST(ConstantsTest
, BuildConstantDataVectors
) {
444 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
446 for (Type
*T
: {Type::getInt8Ty(Context
), Type::getInt16Ty(Context
),
447 Type::getInt32Ty(Context
), Type::getInt64Ty(Context
)}) {
448 Constant
*Vals
[] = {ConstantInt::get(T
, 0), ConstantInt::get(T
, 1)};
449 Constant
*CDV
= ConstantVector::get(Vals
);
450 ASSERT_TRUE(dyn_cast
<ConstantDataVector
>(CDV
) != nullptr)
451 << " T = " << getNameOfType(T
);
454 for (Type
*T
: {Type::getHalfTy(Context
), Type::getFloatTy(Context
),
455 Type::getDoubleTy(Context
)}) {
456 Constant
*Vals
[] = {ConstantFP::get(T
, 0), ConstantFP::get(T
, 1)};
457 Constant
*CDV
= ConstantVector::get(Vals
);
458 ASSERT_TRUE(dyn_cast
<ConstantDataVector
>(CDV
) != nullptr)
459 << " T = " << getNameOfType(T
);
463 TEST(ConstantsTest
, BitcastToGEP
) {
465 std::unique_ptr
<Module
> M(new Module("MyModule", Context
));
467 auto *i32
= Type::getInt32Ty(Context
);
468 auto *U
= StructType::create(Context
, "Unsized");
469 Type
*EltTys
[] = {i32
, U
};
470 auto *S
= StructType::create(EltTys
);
472 auto *G
= new GlobalVariable(*M
, S
, false,
473 GlobalValue::ExternalLinkage
, nullptr);
474 auto *PtrTy
= PointerType::get(i32
, 0);
475 auto *C
= ConstantExpr::getBitCast(G
, PtrTy
);
476 ASSERT_EQ(cast
<ConstantExpr
>(C
)->getOpcode(), Instruction::BitCast
);
479 } // end anonymous namespace
480 } // end namespace llvm