Skip to content

Commit cf444ac

Browse files
committed
[Loads] Check for overflow when adding MaxPtrDiff + Offset.
MaxPtrDiff + Offset may wrap, leading to incorrect results. Use uadd_ov to check for overflow.
1 parent a6bd36e commit cf444ac

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

llvm/lib/Analysis/Loads.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,10 @@ bool llvm::isDereferenceableAndAlignedInLoop(
386386
if (Offset->getAPInt().urem(Alignment.value()) != 0)
387387
return false;
388388

389-
AccessSize = MaxPtrDiff + Offset->getAPInt();
389+
bool Overflow = false;
390+
AccessSize = MaxPtrDiff.uadd_ov(Offset->getAPInt(), Overflow);
391+
if (Overflow)
392+
return false;
390393
AccessSizeSCEV = SE.getAddExpr(PtrDiff, Offset);
391394
Base = NewBase->getValue();
392395
} else

llvm/test/Transforms/LoopVectorize/load-deref-pred-align.ll

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -740,8 +740,6 @@ exit:
740740
ret void
741741
}
742742

743-
; FIXME: Currently %l.idx is incorrectly executed unconditionally in the vector
744-
; loop.
745743
define void @adding_offset_overflows(i32 %n, ptr %A) {
746744
; CHECK-LABEL: @adding_offset_overflows(
747745
; CHECK-NEXT: entry:
@@ -767,8 +765,26 @@ define void @adding_offset_overflows(i32 %n, ptr %A) {
767765
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[OFFSET_IDX]]
768766
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP2]], align 4
769767
; CHECK-NEXT: [[TMP3:%.*]] = icmp ne <2 x i32> [[WIDE_LOAD]], zeroinitializer
770-
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i32, ptr [[B]], i64 [[OFFSET_IDX]]
771-
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x i32>, ptr [[TMP4]], align 4
768+
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i1> [[TMP3]], i32 0
769+
; CHECK-NEXT: br i1 [[TMP4]], label [[PRED_LOAD_IF:%.*]], label [[PRED_LOAD_CONTINUE:%.*]]
770+
; CHECK: pred.load.if:
771+
; CHECK-NEXT: [[TMP15:%.*]] = add i64 [[OFFSET_IDX]], 0
772+
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[B]], i64 [[TMP15]]
773+
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 4
774+
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x i32> poison, i32 [[TMP17]], i32 0
775+
; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE]]
776+
; CHECK: pred.load.continue:
777+
; CHECK-NEXT: [[TMP19:%.*]] = phi <2 x i32> [ poison, [[VECTOR_BODY]] ], [ [[TMP18]], [[PRED_LOAD_IF]] ]
778+
; CHECK-NEXT: [[TMP20:%.*]] = extractelement <2 x i1> [[TMP3]], i32 1
779+
; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_LOAD_IF1:%.*]], label [[PRED_LOAD_CONTINUE2:%.*]]
780+
; CHECK: pred.load.if1:
781+
; CHECK-NEXT: [[TMP21:%.*]] = add i64 [[OFFSET_IDX]], 1
782+
; CHECK-NEXT: [[TMP22:%.*]] = getelementptr i32, ptr [[B]], i64 [[TMP21]]
783+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP22]], align 4
784+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP19]], i32 [[TMP13]], i32 1
785+
; CHECK-NEXT: br label [[PRED_LOAD_CONTINUE2]]
786+
; CHECK: pred.load.continue2:
787+
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i32> [ [[TMP19]], [[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], [[PRED_LOAD_IF1]] ]
772788
; CHECK-NEXT: [[TMP5:%.*]] = sext <2 x i32> [[WIDE_LOAD1]] to <2 x i64>
773789
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i1> [[TMP3]], i32 0
774790
; CHECK-NEXT: br i1 [[TMP6]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]]
@@ -780,12 +796,12 @@ define void @adding_offset_overflows(i32 %n, ptr %A) {
780796
; CHECK: pred.store.continue:
781797
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <2 x i1> [[TMP3]], i32 1
782798
; CHECK-NEXT: br i1 [[TMP9]], label [[PRED_STORE_IF2:%.*]], label [[PRED_STORE_CONTINUE3]]
783-
; CHECK: pred.store.if2:
799+
; CHECK: pred.store.if3:
784800
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i64> [[TMP5]], i32 1
785801
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[C]], i64 [[TMP10]]
786802
; CHECK-NEXT: store i32 0, ptr [[TMP11]], align 4
787803
; CHECK-NEXT: br label [[PRED_STORE_CONTINUE3]]
788-
; CHECK: pred.store.continue3:
804+
; CHECK: pred.store.continue4:
789805
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
790806
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
791807
; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]

0 commit comments

Comments
 (0)