Skip to content

Commit

Permalink
Don't assert if we can't constant fold extract/insertvalue
Browse files Browse the repository at this point in the history
A non-constant-foldable static initializer expression containing insertvalue or
extractvalue had been causing an assert:

  Constants.cpp:1971: Assertion `FC && "ExtractValue constant expr couldn't be
                                 folded!"' failed.

Now we report a more-sensible "Unsupported expression in static initializer"
error instead.

Fixes PR15417.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186044 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Hal Finkel committed Jul 10, 2013
1 parent b0d5993 commit 10050d1
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 8 deletions.
29 changes: 21 additions & 8 deletions lib/IR/Constants.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1954,14 +1954,22 @@ Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,

Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val,
ArrayRef<unsigned> Idxs) {
assert(Agg->getType()->isFirstClassType() &&
"Non-first-class type for constant insertvalue expression");

assert(ExtractValueInst::getIndexedType(Agg->getType(),
Idxs) == Val->getType() &&
"insertvalue indices invalid!");
assert(Agg->getType()->isFirstClassType() &&
"Non-first-class type for constant insertvalue expression");
Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs);
assert(FC && "insertvalue constant expr couldn't be folded!");
return FC;
Type *ReqTy = Val->getType();

if (Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs))
return FC;

Constant *ArgVec[] = { Agg, Val };
const ExprMapKeyType Key(Instruction::InsertValue, ArgVec, 0, 0, Idxs);

LLVMContextImpl *pImpl = Agg->getContext().pImpl;
return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
}

Constant *ConstantExpr::getExtractValue(Constant *Agg,
Expand All @@ -1975,9 +1983,14 @@ Constant *ConstantExpr::getExtractValue(Constant *Agg,

assert(Agg->getType()->isFirstClassType() &&
"Non-first-class type for constant extractvalue expression");
Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs);
assert(FC && "ExtractValue constant expr couldn't be folded!");
return FC;
if (Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs))
return FC;

Constant *ArgVec[] = { Agg };
const ExprMapKeyType Key(Instruction::ExtractValue, ArgVec, 0, 0, Idxs);

LLVMContextImpl *pImpl = Agg->getContext().pImpl;
return pImpl->ExprConstants.getOrCreate(ReqTy, Key);
}

Constant *ConstantExpr::getNeg(Constant *C, bool HasNUW, bool HasNSW) {
Expand Down
8 changes: 8 additions & 0 deletions test/Other/nonconst-static-ev.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
; RUN: not llc < %s 2> %t
; RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s

@0 = global i8 extractvalue ([1 x i8] select (i1 ptrtoint (i32* @1 to i1), [1 x i8] [ i8 1 ], [1 x i8] [ i8 2 ]), 0)
@1 = external global i32

; CHECK-ERRORS: Unsupported expression in static initializer: extractvalue

8 changes: 8 additions & 0 deletions test/Other/nonconst-static-iv.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
; RUN: not llc < %s 2> %t
; RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s

@0 = global i8 insertvalue( { i8 } select (i1 ptrtoint (i32* @1 to i1), { i8 } { i8 1 }, { i8 } { i8 2 }), i8 0, 0)
@1 = external global i32

; CHECK-ERRORS: Unsupported expression in static initializer: insertvalue

0 comments on commit 10050d1

Please sign in to comment.