Skip to content

Commit dce5bf8

Browse files
authored
[ValueTracking] AllowEphemerals for alignment assumptions. (#108632)
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. PR: #108632
1 parent 9fd7523 commit dce5bf8

File tree

2 files changed

+20
-45
lines changed

2 files changed

+20
-45
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,9 +828,12 @@ void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
828828
continue;
829829
if (RetainedKnowledge RK = getKnowledgeFromBundle(
830830
*I, I->bundle_op_info_begin()[Elem.Index])) {
831+
// Allow AllowEphemerals in isValidAssumeForContext, as the CxtI might
832+
// be the producer of the pointer in the bundle. At the moment, align
833+
// assumptions aren't optimized away.
831834
if (RK.WasOn == V && RK.AttrKind == Attribute::Alignment &&
832835
isPowerOf2_64(RK.ArgValue) &&
833-
isValidAssumeForContext(I, Q.CxtI, Q.DT))
836+
isValidAssumeForContext(I, Q.CxtI, Q.DT, /*AllowEphemerals*/ true))
834837
Known.Zero.setLowBits(Log2_64(RK.ArgValue));
835838
}
836839
continue;

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

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,37 +1709,23 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_1(ptr %a, ptr %b, pt
17091709
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_1'
17101710
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_1
17111711
; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1712-
; CHECK-NEXT: --> %a_ U: full-set S: full-set
1712+
; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17131713
; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1714-
; CHECK-NEXT: --> %b_ U: full-set S: full-set
1714+
; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17151715
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1716-
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1716+
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17171717
; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
17181718
; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
17191719
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1720-
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1720+
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17211721
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_1
17221722
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
17231723
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1724-
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1725-
; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1726-
; CHECK-NEXT: Predicates:
1727-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1728-
; CHECK-EMPTY:
1729-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1730-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1724+
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1725+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1726+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
17311727
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1732-
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1733-
; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1734-
; CHECK-NEXT: Predicates:
1735-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1736-
; CHECK-EMPTY:
1737-
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951
1738-
; CHECK-NEXT: Predicates:
1739-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1740-
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1741-
; CHECK-NEXT: Predicates:
1742-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1728+
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
17431729
;
17441730
entry:
17451731
%a_ = load ptr, ptr %a
@@ -1768,37 +1754,23 @@ define void @ptr_induction_early_exit_eq_1_align_assumption_2(ptr %a, ptr %b, pt
17681754
; CHECK-LABEL: 'ptr_induction_early_exit_eq_1_align_assumption_2'
17691755
; CHECK-NEXT: Classifying expressions for: @ptr_induction_early_exit_eq_1_align_assumption_2
17701756
; CHECK-NEXT: %a_ = load ptr, ptr %a, align 8
1771-
; CHECK-NEXT: --> %a_ U: full-set S: full-set
1757+
; CHECK-NEXT: --> %a_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17721758
; CHECK-NEXT: %b_ = load ptr, ptr %b, align 8
1773-
; CHECK-NEXT: --> %b_ U: full-set S: full-set
1759+
; CHECK-NEXT: --> %b_ U: [0,-7) S: [-9223372036854775808,9223372036854775801)
17741760
; CHECK-NEXT: %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a_, %entry ]
1775-
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1761+
; CHECK-NEXT: --> {%a_,+,8}<nuw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17761762
; CHECK-NEXT: %ld1 = load ptr, ptr %ptr.iv, align 8
17771763
; CHECK-NEXT: --> %ld1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
17781764
; CHECK-NEXT: %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8
1779-
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
1765+
; CHECK-NEXT: --> {(8 + %a_),+,8}<nw><%loop> U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }
17801766
; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1_align_assumption_2
17811767
; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.
17821768
; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***
1783-
; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE***
1784-
; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1785-
; CHECK-NEXT: Predicates:
1786-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1787-
; CHECK-EMPTY:
1788-
; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.
1789-
; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.
1769+
; CHECK-NEXT: exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1770+
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 2305843009213693951
1771+
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
17901772
; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***
1791-
; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE***
1792-
; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1793-
; CHECK-NEXT: Predicates:
1794-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1795-
; CHECK-EMPTY:
1796-
; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951
1797-
; CHECK-NEXT: Predicates:
1798-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1799-
; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
1800-
; CHECK-NEXT: Predicates:
1801-
; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b_ to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a_ to i64) to i3))) to i64) == 0
1773+
; CHECK-NEXT: symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a_ to i64)) + (ptrtoint ptr %b_ to i64)) /u 8)
18021774
;
18031775
entry:
18041776
%a_ = load ptr, ptr %a

0 commit comments

Comments
 (0)