diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index 1971c28fc4c4d..47b96e00c7765 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -881,7 +881,7 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP, Type *IntIdxTy = DL.getIndexType(Ptr->getType()); for (unsigned i = 1, e = Ops.size(); i != e; ++i) - if (!isa(Ops[i])) + if (!isa(Ops[i]) || !Ops[i]->getType()->isIntegerTy()) return nullptr; unsigned BitWidth = DL.getTypeSizeInBits(IntIdxTy); diff --git a/llvm/lib/IR/Operator.cpp b/llvm/lib/IR/Operator.cpp index 199eb4d90f556..24aeb5003b609 100644 --- a/llvm/lib/IR/Operator.cpp +++ b/llvm/lib/IR/Operator.cpp @@ -126,7 +126,8 @@ bool GEPOperator::accumulateConstantOffset( APInt &Offset, function_ref ExternalAnalysis) { // Fast path for canonical getelementptr i8 form. if (SourceType->isIntegerTy(8) && !ExternalAnalysis) { - if (auto *CI = dyn_cast(Index.front())) { + auto *CI = dyn_cast(Index.front()); + if (CI && CI->getType()->isIntegerTy()) { Offset += CI->getValue().sextOrTrunc(Offset.getBitWidth()); return true; } @@ -163,7 +164,8 @@ bool GEPOperator::accumulateConstantOffset( Value *V = GTI.getOperand(); StructType *STy = GTI.getStructTypeOrNull(); // Handle ConstantInt if possible. - if (auto ConstOffset = dyn_cast(V)) { + auto *ConstOffset = dyn_cast(V); + if (ConstOffset && ConstOffset->getType()->isIntegerTy()) { if (ConstOffset->isZero()) continue; // if the type is scalable and the constant is not zero (vscale * n * 0 = @@ -222,7 +224,8 @@ bool GEPOperator::collectOffset( Value *V = GTI.getOperand(); StructType *STy = GTI.getStructTypeOrNull(); // Handle ConstantInt if possible. - if (auto ConstOffset = dyn_cast(V)) { + auto *ConstOffset = dyn_cast(V); + if (ConstOffset && ConstOffset->getType()->isIntegerTy()) { if (ConstOffset->isZero()) continue; // If the type is scalable and the constant is not zero (vscale * n * 0 = diff --git a/llvm/test/Transforms/GVN/opaque-ptr.ll b/llvm/test/Transforms/GVN/opaque-ptr.ll index 4a0f9d319501c..8a7e420584859 100644 --- a/llvm/test/Transforms/GVN/opaque-ptr.ll +++ b/llvm/test/Transforms/GVN/opaque-ptr.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=gvn < %s | FileCheck %s +; RUN: opt -S -passes=gvn -use-constant-int-for-fixed-length-splat < %s | FileCheck %s declare void @use(ptr) declare void @use.i32(i32) @@ -58,6 +59,10 @@ define void @gep_cse_offset_canonicalization(ptr %p, i64 %idx, i64 %idx2) { ; CHECK-NEXT: call void @use(ptr [[GEP6]]) ; CHECK-NEXT: call void @use(ptr [[GEP6_SAME]]) ; CHECK-NEXT: call void @use(ptr [[GEP6_DIFFERENT]]) +; CHECK-NEXT: %gep7 = getelementptr <16 x i32>, ptr %p, i64 1 +; CHECK-NEXT: %gep7.different = getelementptr <16 x i32>, ptr %p, <16 x i64> splat (i64 1) +; CHECK-NEXT: call void @use(ptr %gep7) +; CHECK-NEXT: call void @use(<16 x ptr> %gep7.different) ; CHECK-NEXT: ret void ; %gep1 = getelementptr i64, ptr %p, i64 1 @@ -101,6 +106,10 @@ define void @gep_cse_offset_canonicalization(ptr %p, i64 %idx, i64 %idx2) { call void @use(ptr %gep6) call void @use(ptr %gep6.same) call void @use(ptr %gep6.different) + %gep7 = getelementptr <16 x i32>, ptr %p, i64 1 + %gep7.different = getelementptr <16 x i32>, ptr %p, <16 x i64> splat (i64 1) + call void @use(ptr %gep7) + call void @use(<16 x ptr> %gep7.different) ret void } diff --git a/llvm/test/Transforms/InstCombine/gep-vector-indices.ll b/llvm/test/Transforms/InstCombine/gep-vector-indices.ll index e9534e45ec141..9f33f4e9c206a 100644 --- a/llvm/test/Transforms/InstCombine/gep-vector-indices.ll +++ b/llvm/test/Transforms/InstCombine/gep-vector-indices.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes=instcombine %s -S | FileCheck %s +; RUN: opt -passes=instcombine -use-constant-int-for-fixed-length-splat %s -S | FileCheck %s define ptr @vector_splat_indices_v2i64_ext0(ptr %a) { ; CHECK-LABEL: @vector_splat_indices_v2i64_ext0( diff --git a/llvm/test/Transforms/InstSimplify/gep.ll b/llvm/test/Transforms/InstSimplify/gep.ll index b23494fc56aa4..a330f5cbc9268 100644 --- a/llvm/test/Transforms/InstSimplify/gep.ll +++ b/llvm/test/Transforms/InstSimplify/gep.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -passes=instsimplify < %s | FileCheck %s +; RUN: opt -S -passes=instsimplify -use-constant-int-for-fixed-length-splat < %s | FileCheck %s target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"