Index: include/llvm/Analysis/TargetTransformInfoImpl.h =================================================================== --- include/llvm/Analysis/TargetTransformInfoImpl.h +++ include/llvm/Analysis/TargetTransformInfoImpl.h @@ -674,7 +674,7 @@ int64_t Scale = 0; auto GTI = gep_type_begin(PointeeType, Operands); - Type *TargetType; + Type *TargetType = nullptr; for (auto I = Operands.begin(); I != Operands.end(); ++I, ++GTI) { TargetType = GTI.getIndexedType(); // We assume that the cost of Scalar GEP with constant index and the @@ -702,6 +702,10 @@ } } + // If this GEP has a single operand, the basis, it should be cheap. + if (Operands.empty()) + return TTI::TCC_Free; + // Assumes the address space is 0 when Ptr is nullptr. unsigned AS = (Ptr == nullptr ? 0 : Ptr->getType()->getPointerAddressSpace()); Index: test/Transforms/SimplifyCFG/gepcost.ll =================================================================== --- /dev/null +++ test/Transforms/SimplifyCFG/gepcost.ll @@ -0,0 +1,28 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -simplifycfg | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv7m-none--eabi" + +@glob = external unnamed_addr constant [16 x i8] + +define void @f() { +; CHECK-LABEL: @f( +; CHECK-NEXT: entr: +; CHECK-NEXT: br i1 undef, label [[NEXT:%.*]], label [[EXIT:%.*]] +; CHECK: next: +; CHECK-NEXT: [[PAT:%.*]] = getelementptr [16 x i8], [16 x i8]* @glob +; CHECK-NEXT: br label [[EXIT]] +; CHECK: exit: +; CHECK-NEXT: ret void +; +entr: + br i1 undef, label %next, label %exit + +next: + %pat = getelementptr [16 x i8], [16 x i8]* @glob + br label %exit + +exit: + ret void +}