Skip to content

Commit 4a28f8e

Browse files
nikictstellar
authored andcommitted
[FunctionAttrs] Fix incorrect nonnull inference for non-inbounds GEP (#91180)
For inbounds GEPs, if the source pointer is non-null, the result must also be non-null. However, this does not hold for non-inbounds GEPs. Fixes #91177. (cherry picked from commit f34d30c)
1 parent 0abb89a commit 4a28f8e

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

llvm/lib/Transforms/IPO/FunctionAttrs.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1186,10 +1186,15 @@ static bool isReturnNonNull(Function *F, const SCCNodeSet &SCCNodes,
11861186
switch (RVI->getOpcode()) {
11871187
// Extend the analysis by looking upwards.
11881188
case Instruction::BitCast:
1189-
case Instruction::GetElementPtr:
11901189
case Instruction::AddrSpaceCast:
11911190
FlowsToReturn.insert(RVI->getOperand(0));
11921191
continue;
1192+
case Instruction::GetElementPtr:
1193+
if (cast<GEPOperator>(RVI)->isInBounds()) {
1194+
FlowsToReturn.insert(RVI->getOperand(0));
1195+
continue;
1196+
}
1197+
return false;
11931198
case Instruction::Select: {
11941199
SelectInst *SI = cast<SelectInst>(RVI);
11951200
FlowsToReturn.insert(SI->getTrueValue());

llvm/test/Transforms/FunctionAttrs/nocapture.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ declare i32 @__gxx_personality_v0(...)
197197

198198
define ptr @lookup_bit(ptr %q, i32 %bitno) readnone nounwind {
199199
; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
200-
; FNATTRS-LABEL: define nonnull ptr @lookup_bit
200+
; FNATTRS-LABEL: define ptr @lookup_bit
201201
; FNATTRS-SAME: (ptr [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR0]] {
202202
; FNATTRS-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32
203203
; FNATTRS-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP]], [[BITNO]]

llvm/test/Transforms/FunctionAttrs/nonnull.ll

+19-4
Original file line numberDiff line numberDiff line change
@@ -905,26 +905,26 @@ define i1 @parent8(ptr %a, ptr %bogus1, ptr %b) personality ptr @esfp{
905905
; FNATTRS-SAME: ptr nonnull [[A:%.*]], ptr nocapture readnone [[BOGUS1:%.*]], ptr nonnull [[B:%.*]]) #[[ATTR7]] personality ptr @esfp {
906906
; FNATTRS-NEXT: entry:
907907
; FNATTRS-NEXT: invoke void @use2nonnull(ptr [[A]], ptr [[B]])
908-
; FNATTRS-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]]
908+
; FNATTRS-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]]
909909
; FNATTRS: cont:
910910
; FNATTRS-NEXT: [[NULL_CHECK:%.*]] = icmp eq ptr [[B]], null
911911
; FNATTRS-NEXT: ret i1 [[NULL_CHECK]]
912912
; FNATTRS: exc:
913913
; FNATTRS-NEXT: [[LP:%.*]] = landingpad { ptr, i32 }
914-
; FNATTRS-NEXT: filter [0 x ptr] zeroinitializer
914+
; FNATTRS-NEXT: filter [0 x ptr] zeroinitializer
915915
; FNATTRS-NEXT: unreachable
916916
;
917917
; ATTRIBUTOR-LABEL: define i1 @parent8(
918918
; ATTRIBUTOR-SAME: ptr nonnull [[A:%.*]], ptr nocapture nofree readnone [[BOGUS1:%.*]], ptr nonnull [[B:%.*]]) #[[ATTR8]] personality ptr @esfp {
919919
; ATTRIBUTOR-NEXT: entry:
920920
; ATTRIBUTOR-NEXT: invoke void @use2nonnull(ptr nonnull [[A]], ptr nonnull [[B]])
921-
; ATTRIBUTOR-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]]
921+
; ATTRIBUTOR-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]]
922922
; ATTRIBUTOR: cont:
923923
; ATTRIBUTOR-NEXT: [[NULL_CHECK:%.*]] = icmp eq ptr [[B]], null
924924
; ATTRIBUTOR-NEXT: ret i1 [[NULL_CHECK]]
925925
; ATTRIBUTOR: exc:
926926
; ATTRIBUTOR-NEXT: [[LP:%.*]] = landingpad { ptr, i32 }
927-
; ATTRIBUTOR-NEXT: filter [0 x ptr] zeroinitializer
927+
; ATTRIBUTOR-NEXT: filter [0 x ptr] zeroinitializer
928928
; ATTRIBUTOR-NEXT: unreachable
929929
;
930930

@@ -1415,5 +1415,20 @@ define void @PR43833_simple(ptr %0, i32 %1) {
14151415
br i1 %11, label %7, label %8
14161416
}
14171417

1418+
define ptr @pr91177_non_inbounds_gep(ptr nonnull %arg) {
1419+
; FNATTRS-LABEL: define ptr @pr91177_non_inbounds_gep(
1420+
; FNATTRS-SAME: ptr nonnull readnone [[ARG:%.*]]) #[[ATTR0]] {
1421+
; FNATTRS-NEXT: [[RES:%.*]] = getelementptr i8, ptr [[ARG]], i64 -8
1422+
; FNATTRS-NEXT: ret ptr [[RES]]
1423+
;
1424+
; ATTRIBUTOR-LABEL: define ptr @pr91177_non_inbounds_gep(
1425+
; ATTRIBUTOR-SAME: ptr nofree nonnull readnone [[ARG:%.*]]) #[[ATTR0]] {
1426+
; ATTRIBUTOR-NEXT: [[RES:%.*]] = getelementptr i8, ptr [[ARG]], i64 -8
1427+
; ATTRIBUTOR-NEXT: ret ptr [[RES]]
1428+
;
1429+
%res = getelementptr i8, ptr %arg, i64 -8
1430+
ret ptr %res
1431+
}
1432+
14181433
attributes #0 = { null_pointer_is_valid }
14191434
attributes #1 = { nounwind willreturn}

0 commit comments

Comments
 (0)