Skip to content

Commit 4352d98

Browse files
committed
[ValueTracking] AllowEphemerals for alignment assumptions.
Allow AllowEphemerals in isValidAssumeForContext, as the CxtI might be the producer of the pointer in the bundle. At the moment, align assumptions aren't optimized away. This allows using the assumption in the computeKnownBits call in getConstantMultipleImpl. We could extend the computeKnownBits API to allow callers to specify if ephemerals are allowed, if the info from computeKnownBitsFromContext is used to remove alignment assumptions.
1 parent 84ea257 commit 4352d98

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,9 +820,12 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
820820
continue;
821821
if (RetainedKnowledge RK = getKnowledgeFromBundle(
822822
*I, I->bundle_op_info_begin()[Elem.Index])) {
823+
// Allow AllowEphemerals in isValidAssumeForContext, as the CxtI might
824+
// be the producer of the pointer in the bundle. At the moment, align
825+
// assumptions aren't optimized away.
823826
if (RK.WasOn == V && RK.AttrKind == Attribute::Alignment &&
824827
isPowerOf2_64(RK.ArgValue) &&
825-
isValidAssumeForContext(I, Q.CxtI, Q.DT))
828+
isValidAssumeForContext(I, Q.CxtI, Q.DT, /*AllowEphemerals*/ true))
826829
Known.Zero.setLowBits(Log2_64(RK.ArgValue));
827830
}
828831
continue;

llvm/test/Analysis/ScalarEvolution/max-backedge-taken-count-guard-info.ll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,23 +1777,23 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_1(ptr %a, ptr %b, pt
17771777
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_1'
17781778
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_1
17791779
; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1780-
; CHECK-NEXT: --> %a_ U: full-set S: full-set
1780+
; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17811781
; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1782-
; CHECK-NEXT: --> %b_ U: full-set S: full-set
1782+
; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17831783
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1784-
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1784+
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17851785
; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
17861786
; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
17871787
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1788-
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1788+
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17891789
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_1
17901790
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
17911791
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1792-
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1793-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1794-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1792+
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1793+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1794+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
17951795
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1796-
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1796+
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
17971797
;
17981798
entry:
17991799
%a_ = load ptr, ptr %a
@@ -1822,23 +1822,23 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_2(ptr %a, ptr %b, pt
18221822
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_2'
18231823
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_2
18241824
; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1825-
; CHECK-NEXT: --> %a_ U: full-set S: full-set
1825+
; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
18261826
; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1827-
; CHECK-NEXT: --> %b_ U: full-set S: full-set
1827+
; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
18281828
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1829-
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1829+
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
18301830
; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
18311831
; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
18321832
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1833-
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1833+
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
18341834
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_2
18351835
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
18361836
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1837-
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1838-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1839-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1837+
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1838+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1839+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
18401840
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1841-
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1841+
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
18421842
;
18431843
entry:
18441844
%a_ = load ptr, ptr %a

0 commit comments

Comments
 (0)