Index: llvm/lib/Transforms/Scalar/ConstantHoisting.cpp =================================================================== --- llvm/lib/Transforms/Scalar/ConstantHoisting.cpp +++ llvm/lib/Transforms/Scalar/ConstantHoisting.cpp @@ -470,7 +470,7 @@ // Visit constant expressions that have constant integers. if (auto ConstExpr = dyn_cast(Opnd)) { // Handle constant gep expressions. - if (ConstHoistGEP && ConstExpr->isGEPWithNoNotionalOverIndexing()) + if (ConstHoistGEP && isa(ConstExpr)) collectConstantCandidates(ConstCandMap, Inst, Idx, ConstExpr); // Only visit constant cast expressions. @@ -810,7 +810,7 @@ // Visit constant expression. if (auto ConstExpr = dyn_cast(Opnd)) { - if (ConstExpr->isGEPWithNoNotionalOverIndexing()) { + if (isa(ConstExpr)) { // Operand is a ConstantGEP, replace it. updateOperand(ConstUser.Inst, ConstUser.OpndIdx, Mat); return; Index: llvm/test/Transforms/ConstantHoisting/ARM/const-hoist-gep-overindexing.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/ConstantHoisting/ARM/const-hoist-gep-overindexing.ll @@ -0,0 +1,37 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -consthoist -consthoist-gep -S -o - %s | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv6m-none--musleabi" + +%0 = type { [10 x i32], [10 x i16] } + +@global = external dso_local local_unnamed_addr global %0, align 4 + +define dso_local void @zot() { +; CHECK-LABEL: @zot( +; CHECK-NEXT: bb: +; CHECK-NEXT: [[CONST:%.*]] = bitcast i16* getelementptr inbounds ([[TMP0:%.*]], %0* @global, i32 0, i32 1, i32 0) to i16* +; CHECK-NEXT: store i16 undef, i16* [[CONST]], align 2 +; CHECK-NEXT: [[BASE_BITCAST:%.*]] = bitcast i16* [[CONST]] to i8* +; CHECK-NEXT: [[MAT_GEP:%.*]] = getelementptr i8, i8* [[BASE_BITCAST]], i32 2 +; CHECK-NEXT: [[MAT_BITCAST:%.*]] = bitcast i8* [[MAT_GEP]] to i16* +; CHECK-NEXT: store i16 undef, i16* [[MAT_BITCAST]], align 2 +; CHECK-NEXT: [[BASE_BITCAST1:%.*]] = bitcast i16* [[CONST]] to i8* +; CHECK-NEXT: [[MAT_GEP2:%.*]] = getelementptr i8, i8* [[BASE_BITCAST1]], i32 4 +; CHECK-NEXT: [[MAT_BITCAST3:%.*]] = bitcast i8* [[MAT_GEP2]] to i16* +; CHECK-NEXT: store i16 undef, i16* [[MAT_BITCAST3]], align 2 +; CHECK-NEXT: [[BASE_BITCAST4:%.*]] = bitcast i16* [[CONST]] to i8* +; CHECK-NEXT: [[MAT_GEP5:%.*]] = getelementptr i8, i8* [[BASE_BITCAST4]], i32 20 +; CHECK-NEXT: [[MAT_BITCAST6:%.*]] = bitcast i8* [[MAT_GEP5]] to i16* +; CHECK-NEXT: store i16 undef, i16* [[MAT_BITCAST6]], align 2 +; CHECK-NEXT: ret void +; +bb: + store i16 undef, i16* getelementptr inbounds (%0, %0* @global, i32 0, i32 1, i32 0) + store i16 undef, i16* getelementptr inbounds (%0, %0* @global, i32 0, i32 1, i32 1) + store i16 undef, i16* getelementptr inbounds (%0, %0* @global, i32 0, i32 1, i32 2) + store i16 undef, i16* getelementptr inbounds (%0, %0* @global, i32 0, i32 1, i32 10) + ret void +} +