Created
January 2, 2017 14:03
-
-
Save nalimilan/3c846e428c0d1f281c706ee26cd67c12 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit 83dc06334ff95ad18a951d0bb540290510f2f81a | |
Author: Keno Fischer <[email protected]> | |
Date: Thu Dec 8 17:22:35 2016 +0000 | |
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 | |
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289073 91177308-0d34-0410-b5e6-96231b3b80d8 | |
diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp | |
index 2d1edfe..1c0bf01a 100644 | |
--- a/lib/Analysis/ConstantFolding.cpp | |
+++ b/lib/Analysis/ConstantFolding.cpp | |
@@ -692,14 +692,15 @@ Constant *CastGEPIndices(Type *SrcElemTy, ArrayRef<Constant *> Ops, | |
Type *ResultTy, 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, | |
diff --git a/test/Analysis/ConstantFolding/vectorgep-crash.ll b/test/Analysis/ConstantFolding/vectorgep-crash.ll | |
new file mode 100644 | |
index 0000000..bcc96b2 | |
--- /dev/null | |
+++ b/test/Analysis/ConstantFolding/vectorgep-crash.ll | |
@@ -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 | |
+} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment