Skip to content

Commit

Permalink
[instcombine] propagate single use freeze(gep inbounds X)
Browse files Browse the repository at this point in the history
This is a follow on for D111675 which implements the gep case. I'd originally left it out because I was hoping to actually implement the inrange todo, but after a bit of staring at the code, decided to leave it as is since it doesn't effect this use case (i.e. instcombine requires the op to freeze to be an instruction).

Differential Revision: https://reviews.llvm.org/D111691
  • Loading branch information
preames committed Oct 13, 2021
1 parent 4cd6cc6 commit 24c9016
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
11 changes: 7 additions & 4 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4959,6 +4959,9 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
if (const auto *ExactOp = dyn_cast<PossiblyExactOperator>(Op))
if (ExactOp->isExact())
return true;
if (const auto *GEP = dyn_cast<GEPOperator>(Op))
if (GEP->isInBounds())
return true;
}

// TODO: this should really be under the ConsiderFlags block, but currently
Expand Down Expand Up @@ -5051,10 +5054,10 @@ static bool canCreateUndefOrPoison(const Operator *Op, bool PoisonOnly,
case Instruction::ICmp:
case Instruction::FCmp:
return false;
case Instruction::GetElementPtr: {
const auto *GEP = cast<GEPOperator>(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<ConstantExpr>(Op);
if (isa<CastInst>(Op) || (CE && CE->isCast()))
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/InstCombine/freeze.ll
Original file line number Diff line number Diff line change
Expand Up @@ -354,9 +354,9 @@ define i32 @propagate_drop_lshr2(i32 %arg, i32 %unknown) {

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
Expand Down

0 comments on commit 24c9016

Please sign in to comment.