Skip to content

Commit

Permalink
[InstCombine] Check inbounds in load/store of gep null transform (PR4…
Browse files Browse the repository at this point in the history
…8577)

If the GEP isn't inbounds, then accessing a GEP of null location
is generally not UB.

While this is a minimal fix, the GEP of null handling should
probably be its own fold.
  • Loading branch information
nikic committed Dec 23, 2020
1 parent de127d8 commit 899faa5
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -908,15 +908,16 @@ static bool canSimplifyNullStoreOrGEP(StoreInst &SI) {

auto *Ptr = SI.getPointerOperand();
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Ptr))
Ptr = GEPI->getOperand(0);
if (GEPI->isInBounds())
Ptr = GEPI->getOperand(0);
return (isa<ConstantPointerNull>(Ptr) &&
!NullPointerIsDefined(SI.getFunction(), SI.getPointerAddressSpace()));
}

static bool canSimplifyNullLoadOrGEP(LoadInst &LI, Value *Op) {
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
const Value *GEPI0 = GEPI->getOperand(0);
if (isa<ConstantPointerNull>(GEPI0) &&
if (isa<ConstantPointerNull>(GEPI0) && GEPI->isInBounds() &&
!NullPointerIsDefined(LI.getFunction(), GEPI->getPointerAddressSpace()))
return true;
}
Expand Down
5 changes: 3 additions & 2 deletions llvm/test/Transforms/InstCombine/load.ll
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ define i32 @load_gep_null_inbounds(i64 %X) {

define i32 @load_gep_null_not_inbounds(i64 %X) {
; CHECK-LABEL: @load_gep_null_not_inbounds(
; CHECK-NEXT: store i32 undef, i32* null, align 536870912
; CHECK-NEXT: ret i32 undef
; CHECK-NEXT: [[V:%.*]] = getelementptr i32, i32* null, i64 [[X:%.*]]
; CHECK-NEXT: [[R:%.*]] = load i32, i32* [[V]], align 4
; CHECK-NEXT: ret i32 [[R]]
;
%V = getelementptr i32, i32* null, i64 %X
%R = load i32, i32* %V
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/InstCombine/store.ll
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ define void @store_at_gep_off_null_inbounds(i64 %offset) {
define void @store_at_gep_off_null_not_inbounds(i64 %offset) {
; CHECK-LABEL: @store_at_gep_off_null_not_inbounds(
; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, i32* null, i64 [[OFFSET:%.*]]
; CHECK-NEXT: store i32 undef, i32* [[PTR]], align 4
; CHECK-NEXT: store i32 24, i32* [[PTR]], align 4
; CHECK-NEXT: ret void
;
%ptr = getelementptr i32, i32 *null, i64 %offset
Expand Down

0 comments on commit 899faa5

Please sign in to comment.