diff options
-rw-r--r-- | llvm/lib/IR/ConstantFold.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Assembler/ConstantExprFoldCast.ll | 4 | ||||
-rw-r--r-- | llvm/unittests/IR/ConstantsTest.cpp | 17 |
3 files changed, 22 insertions, 1 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index 68ddf096754..979bbbd0ab7 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -109,7 +109,7 @@ static Constant *FoldBitCast(Constant *V, Type *DestTy) { if (PointerType *PTy = dyn_cast<PointerType>(V->getType())) if (PointerType *DPTy = dyn_cast<PointerType>(DestTy)) if (PTy->getAddressSpace() == DPTy->getAddressSpace() - && DPTy->getElementType()->isSized()) { + && PTy->getElementType()->isSized()) { SmallVector<Value*, 8> IdxList; Value *Zero = Constant::getNullValue(Type::getInt32Ty(DPTy->getContext())); diff --git a/llvm/test/Assembler/ConstantExprFoldCast.ll b/llvm/test/Assembler/ConstantExprFoldCast.ll index 094f87be92c..dfe840cc37d 100644 --- a/llvm/test/Assembler/ConstantExprFoldCast.ll +++ b/llvm/test/Assembler/ConstantExprFoldCast.ll @@ -15,3 +15,7 @@ ; Address space cast AS0 null-> AS1 null @H = global i32 addrspace(1)* addrspacecast(i32* null to i32 addrspace(1)*) + +; Bitcast -> GEP +@I = external global { i32 } +@J = global i32* bitcast ({ i32 }* @I to i32*) diff --git a/llvm/unittests/IR/ConstantsTest.cpp b/llvm/unittests/IR/ConstantsTest.cpp index 0bf98f35b3c..e3b303a350d 100644 --- a/llvm/unittests/IR/ConstantsTest.cpp +++ b/llvm/unittests/IR/ConstantsTest.cpp @@ -433,5 +433,22 @@ TEST(ConstantsTest, BuildConstantDataVectors) { } } +TEST(ConstantsTest, BitcastToGEP) { + LLVMContext Context; + std::unique_ptr<Module> M(new Module("MyModule", Context)); + + auto *i32 = Type::getInt32Ty(Context); + auto *U = StructType::create(Context, "Unsized"); + Type *EltTys[] = {i32, U}; + auto *S = StructType::create(EltTys); + + auto *G = new GlobalVariable(*M, S, false, + GlobalValue::ExternalLinkage, nullptr); + auto *PtrTy = PointerType::get(i32, 0); + auto *C = ConstantExpr::getBitCast(G, PtrTy); + ASSERT_EQ(dyn_cast<ConstantExpr>(C)->getOpcode(), + Instruction::BitCast); +} + } // end anonymous namespace } // end namespace llvm |