From: Michael Kuperstein Date: Wed, 21 Dec 2016 18:29:47 +0000 (+0000) Subject: [LLParser] Parse vector GEP constant expression correctly X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=88f15eedbbf49c88f4386e0400936b8874fd5717;p=platform%2Fupstream%2Fllvm.git [LLParser] Parse vector GEP constant expression correctly The constantexpr parsing was too constrained and rejected legal vector GEPs. This relaxes it to be similar to the ones for instruction parsing. This fixes PR30816. Differential Revision: https://reviews.llvm.org/D28013 llvm-svn: 290261 --- diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 712a2c6..d1891b7 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3193,20 +3193,23 @@ bool LLParser::ParseValID(ValID &ID, PerFunctionState *PFS) { ExplicitTypeLoc, "explicit pointee type doesn't match operand's pointee type"); + unsigned GEPWidth = + BaseType->isVectorTy() ? BaseType->getVectorNumElements() : 0; + ArrayRef Indices(Elts.begin() + 1, Elts.end()); for (Constant *Val : Indices) { Type *ValTy = Val->getType(); if (!ValTy->getScalarType()->isIntegerTy()) return Error(ID.Loc, "getelementptr index must be an integer"); - if (ValTy->isVectorTy() != BaseType->isVectorTy()) - return Error(ID.Loc, "getelementptr index type missmatch"); if (ValTy->isVectorTy()) { unsigned ValNumEl = ValTy->getVectorNumElements(); - unsigned PtrNumEl = BaseType->getVectorNumElements(); - if (ValNumEl != PtrNumEl) + if (GEPWidth && (ValNumEl != GEPWidth)) return Error( ID.Loc, "getelementptr vector index has a wrong number of elements"); + // GEPWidth may have been unknown because the base is a scalar, + // but it is known now. + GEPWidth = ValNumEl; } } diff --git a/llvm/test/Assembler/getelementptr_vec_ce.ll b/llvm/test/Assembler/getelementptr_vec_ce.ll new file mode 100644 index 0000000..4cf2964 --- /dev/null +++ b/llvm/test/Assembler/getelementptr_vec_ce.ll @@ -0,0 +1,9 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s + +@G = global [4 x i32] zeroinitializer + +; CHECK-LABEL: @foo +; CHECK: ret <4 x i32*> getelementptr ([4 x i32], [4 x i32]* @G, <4 x i32> zeroinitializer, <4 x i32> ) +define <4 x i32*> @foo() { + ret <4 x i32*> getelementptr ([4 x i32], [4 x i32]* @G, i32 0, <4 x i32> ) +} diff --git a/llvm/test/Assembler/getelementptr_vec_ce2.ll b/llvm/test/Assembler/getelementptr_vec_ce2.ll new file mode 100644 index 0000000..06362c8 --- /dev/null +++ b/llvm/test/Assembler/getelementptr_vec_ce2.ll @@ -0,0 +1,8 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +@G = global [4 x [4 x i32]] zeroinitializer + +; CHECK: getelementptr vector index has a wrong number of elements +define <4 x i32*> @foo() { + ret <4 x i32*> getelementptr ([4 x [4 x i32]], [4 x [4 x i32]]* @G, i32 0, <4 x i32> , <8 x i32> zeroinitializer) +}