diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -4959,6 +4959,9 @@ if (const auto *ExactOp = dyn_cast(Op)) if (ExactOp->isExact()) return true; + if (const auto *GEP = dyn_cast(Op)) + if (GEP->isInBounds()) + return true; } // TODO: this should really be under the ConsiderFlags block, but currently @@ -5051,10 +5054,10 @@ case Instruction::ICmp: case Instruction::FCmp: return false; - case Instruction::GetElementPtr: { - const auto *GEP = cast(Op); - return GEP->isInBounds(); - } + case Instruction::GetElementPtr: + // inbounds is handled above + // TODO: what about inrange on constexpr? + return false; default: { const auto *CE = dyn_cast(Op); if (isa(Op) || (CE && CE->isCast())) diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll --- a/llvm/test/Transforms/InstCombine/freeze.ll +++ b/llvm/test/Transforms/InstCombine/freeze.ll @@ -354,9 +354,9 @@ define i8* @propagate_drop_gep1(i8* %arg) { ; CHECK-LABEL: @propagate_drop_gep1( -; CHECK-NEXT: [[V1:%.*]] = getelementptr inbounds i8, i8* [[ARG:%.*]], i64 16 -; CHECK-NEXT: [[V1_FR:%.*]] = freeze i8* [[V1]] -; CHECK-NEXT: ret i8* [[V1_FR]] +; CHECK-NEXT: [[ARG_FR:%.*]] = freeze i8* [[ARG:%.*]] +; CHECK-NEXT: [[V1:%.*]] = getelementptr i8, i8* [[ARG_FR]], i64 16 +; CHECK-NEXT: ret i8* [[V1]] ; %v1 = getelementptr inbounds i8, i8* %arg, i64 16 %v1.fr = freeze i8* %v1