mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
ConstantFolding: Don't crash when encountering vector GEP
ConstantFolding tried to cast one of the scalar indices to a vector type. Instead, use the vector type only for the first index (which is the only one allowed to be a vector) and use its scalar type otherwise. Fixes PR31250. Reviewers: majnemer Differential Revision: https://reviews.llvm.org/D27389 llvm-svn: 289073
This commit is contained in:
parent
c1ee2b7cbe
commit
ab41662e58
@ -734,14 +734,15 @@ Constant *CastGEPIndices(Type *SrcElemTy, ArrayRef<Constant *> Ops,
|
||||
Type *ResultTy, Optional<unsigned> InRangeIndex,
|
||||
const DataLayout &DL, const TargetLibraryInfo *TLI) {
|
||||
Type *IntPtrTy = DL.getIntPtrType(ResultTy);
|
||||
Type *IntPtrScalarTy = IntPtrTy->getScalarType();
|
||||
|
||||
bool Any = false;
|
||||
SmallVector<Constant*, 32> NewIdxs;
|
||||
for (unsigned i = 1, e = Ops.size(); i != e; ++i) {
|
||||
if ((i == 1 ||
|
||||
!isa<StructType>(GetElementPtrInst::getIndexedType(SrcElemTy,
|
||||
Ops.slice(1, i - 1)))) &&
|
||||
Ops[i]->getType() != IntPtrTy) {
|
||||
!isa<StructType>(GetElementPtrInst::getIndexedType(
|
||||
SrcElemTy, Ops.slice(1, i - 1)))) &&
|
||||
Ops[i]->getType() != (i == 1 ? IntPtrTy : IntPtrScalarTy)) {
|
||||
Any = true;
|
||||
NewIdxs.push_back(ConstantExpr::getCast(CastInst::getCastOpcode(Ops[i],
|
||||
true,
|
||||
|
19
test/Analysis/ConstantFolding/vectorgep-crash.ll
Normal file
19
test/Analysis/ConstantFolding/vectorgep-crash.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: opt -instcombine -S -o - %s | FileCheck %s
|
||||
; Tests that we don't crash upon encountering a vector GEP
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
%Dual = type { %Dual.72, %Partials.73 }
|
||||
%Dual.72 = type { double, %Partials }
|
||||
%Partials = type { [2 x double] }
|
||||
%Partials.73 = type { [2 x %Dual.72] }
|
||||
|
||||
; Function Attrs: sspreq
|
||||
define <8 x i64*> @"julia_axpy!_65480"(%Dual* %arg1, <8 x i64> %arg2) {
|
||||
top:
|
||||
; CHECK: %VectorGep14 = getelementptr inbounds %Dual, %Dual* %arg1, <8 x i64> %arg2, i32 1, i32 0, i64 0, i32 1, i32 0, i64 0
|
||||
%VectorGep14 = getelementptr inbounds %Dual, %Dual* %arg1, <8 x i64> %arg2, i32 1, i32 0, i64 0, i32 1, i32 0, i64 0
|
||||
%0 = bitcast <8 x double*> %VectorGep14 to <8 x i64*>
|
||||
ret <8 x i64*> %0
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user