Skip to content

Commit 67658af

Browse files
authored
[ConstantFolding] Merge constant gep inrange attributes (#150546)
When folding a gep+gep into a single gep, intersect their `inrange` attributes.
1 parent 6564bf6 commit 67658af

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -929,12 +929,11 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP,
929929
if (!AllConstantInt)
930930
break;
931931

932-
// TODO: Try to intersect two inrange attributes?
933-
if (!InRange) {
934-
InRange = GEP->getInRange();
935-
if (InRange)
936-
// Adjust inrange by offset until now.
937-
InRange = InRange->sextOrTrunc(BitWidth).subtract(Offset);
932+
// Adjust inrange offset and intersect inrange attributes
933+
if (auto GEPRange = GEP->getInRange()) {
934+
auto AdjustedGEPRange = GEPRange->sextOrTrunc(BitWidth).subtract(Offset);
935+
InRange =
936+
InRange ? InRange->intersectWith(AdjustedGEPRange) : AdjustedGEPRange;
938937
}
939938

940939
Ptr = cast<Constant>(GEP->getOperand(0));

llvm/test/Transforms/InstSimplify/ConstProp/gep.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,31 @@ define ptr @f2() {
2929
;
3030
ret ptr getelementptr (ptr, ptr getelementptr inbounds inrange(0, 8) ([3 x ptr], ptr @vt, i64 0, i64 1), i64 3)
3131
}
32+
33+
define ptr @f3() {
34+
; CHECK-LABEL: @f3(
35+
; CHECK-NEXT: ret ptr getelementptr inbounds nuw inrange(-8, 0) (i8, ptr @vt, i64 16)
36+
;
37+
ret ptr getelementptr inrange(-16, 8) (ptr, ptr getelementptr inbounds inrange(0, 8) ([3 x ptr], ptr @vt, i64 0, i64 1), i64 1)
38+
}
39+
40+
define ptr @f4() {
41+
; CHECK-LABEL: @f4(
42+
; CHECK-NEXT: ret ptr getelementptr inbounds nuw inrange(-8, 8) (i8, ptr @vt, i64 16)
43+
;
44+
ret ptr getelementptr inrange(-16, 8) (ptr, ptr getelementptr inbounds inrange(0, 24) ([3 x ptr], ptr @vt, i64 0, i64 1), i64 1)
45+
}
46+
47+
define ptr @f5() {
48+
; CHECK-LABEL: @f5(
49+
; CHECK-NEXT: ret ptr getelementptr inbounds nuw inrange(0, 0) (i8, ptr @vt, i64 16)
50+
;
51+
ret ptr getelementptr inrange(0, 8) (ptr, ptr getelementptr inbounds inrange(0, 8) ([3 x ptr], ptr @vt, i64 0, i64 0), i64 2)
52+
}
53+
54+
define ptr @f6() {
55+
; CHECK-LABEL: @f6(
56+
; CHECK-NEXT: ret ptr getelementptr inbounds nuw inrange(-8, 8) (i8, ptr @vt, i64 16)
57+
;
58+
ret ptr getelementptr inrange(-8, 8) (ptr, ptr getelementptr inbounds inrange(-8, 16) ([3 x ptr], ptr @vt, i64 0, i64 1), i64 1)
59+
}

0 commit comments

Comments
 (0)