Skip to content

Commit dd599e9

Browse files
authored
[ValueTracking] Support assume in entry block without DT (#109264)
isValidAssumeForContext() handles a couple of trivial cases even if no dominator tree is available. This adds one more for the case where there is an assume in the entry block, and a use in some other block. The entry block always dominates all blocks. As having context instruction but not having DT is fairly rare, there is not much impact. Only test change is in assume-builder.ll, where less redundant assumes are generated. I've found having this special case is useful for an upcoming change though.
1 parent e0458a2 commit dd599e9

File tree

2 files changed

+20
-25
lines changed

2 files changed

+20
-25
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,8 @@ bool llvm::isValidAssumeForContext(const Instruction *Inv,
528528
if (DT) {
529529
if (DT->dominates(Inv, CxtI))
530530
return true;
531-
} else if (Inv->getParent() == CxtI->getParent()->getSinglePredecessor()) {
531+
} else if (Inv->getParent() == CxtI->getParent()->getSinglePredecessor() ||
532+
Inv->getParent()->isEntryBlock()) {
532533
// We don't have a DT, but this trivially dominates.
533534
return true;
534535
}

llvm/test/Transforms/Util/assume-builder.ll

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -567,15 +567,13 @@ define dso_local i32 @_Z6squarePi(ptr %P, ptr %P1, i1 %cond) {
567567
; BASIC-NEXT: store i32 0, ptr [[P1]], align 4
568568
; BASIC-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
569569
; BASIC: B:
570-
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 8) ]
570+
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
571571
; BASIC-NEXT: store i32 0, ptr [[P]], align 8
572-
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 8) ]
573572
; BASIC-NEXT: store i32 0, ptr [[P1]], align 8
574573
; BASIC-NEXT: br label [[C]]
575574
; BASIC: C:
576-
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 32) ]
575+
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 32) ]
577576
; BASIC-NEXT: store i32 0, ptr [[P]], align 32
578-
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 4) ]
579577
; BASIC-NEXT: store i32 0, ptr [[P1]], align 4
580578
; BASIC-NEXT: ret i32 0
581579
;
@@ -593,15 +591,13 @@ define dso_local i32 @_Z6squarePi(ptr %P, ptr %P1, i1 %cond) {
593591
; ALL-NEXT: store i32 0, ptr [[P1]], align 4
594592
; ALL-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
595593
; ALL: B:
596-
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 8) ]
594+
; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
597595
; ALL-NEXT: store i32 0, ptr [[P]], align 8
598-
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 8) ]
599596
; ALL-NEXT: store i32 0, ptr [[P1]], align 8
600597
; ALL-NEXT: br label [[C]]
601598
; ALL: C:
602-
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 32) ]
599+
; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 32) ]
603600
; ALL-NEXT: store i32 0, ptr [[P]], align 32
604-
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 4) ]
605601
; ALL-NEXT: store i32 0, ptr [[P1]], align 4
606602
; ALL-NEXT: ret i32 0
607603
;
@@ -619,15 +615,13 @@ define dso_local i32 @_Z6squarePi(ptr %P, ptr %P1, i1 %cond) {
619615
; WITH-AC-NEXT: store i32 0, ptr [[P1]], align 4
620616
; WITH-AC-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
621617
; WITH-AC: B:
622-
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 8) ]
618+
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
623619
; WITH-AC-NEXT: store i32 0, ptr [[P]], align 8
624-
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 8) ]
625620
; WITH-AC-NEXT: store i32 0, ptr [[P1]], align 8
626621
; WITH-AC-NEXT: br label [[C]]
627622
; WITH-AC: C:
628-
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P]], i64 4), "nonnull"(ptr [[P]]), "align"(ptr [[P]], i64 32) ]
623+
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 32) ]
629624
; WITH-AC-NEXT: store i32 0, ptr [[P]], align 32
630-
; WITH-AC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(ptr [[P1]], i64 4), "nonnull"(ptr [[P1]]), "align"(ptr [[P1]], i64 4) ]
631625
; WITH-AC-NEXT: store i32 0, ptr [[P1]], align 4
632626
; WITH-AC-NEXT: ret i32 0
633627
;
@@ -667,12 +661,12 @@ define dso_local i32 @_Z6squarePi(ptr %P, ptr %P1, i1 %cond) {
667661
; FULL-SIMPLIFY-NEXT: store i32 0, ptr [[P1]], align 4
668662
; FULL-SIMPLIFY-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
669663
; FULL-SIMPLIFY: B:
670-
; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef, i64 4), "ignore"(ptr undef), "align"(ptr [[P]], i64 8) ]
664+
; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 8) ]
671665
; FULL-SIMPLIFY-NEXT: store i32 0, ptr [[P]], align 8
672666
; FULL-SIMPLIFY-NEXT: store i32 0, ptr [[P1]], align 8
673667
; FULL-SIMPLIFY-NEXT: br label [[C]]
674668
; FULL-SIMPLIFY: C:
675-
; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "ignore"(ptr undef, i64 4), "ignore"(ptr undef), "align"(ptr [[P]], i64 32) ]
669+
; FULL-SIMPLIFY-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P]], i64 32) ]
676670
; FULL-SIMPLIFY-NEXT: store i32 0, ptr [[P]], align 32
677671
; FULL-SIMPLIFY-NEXT: store i32 0, ptr [[P1]], align 4
678672
; FULL-SIMPLIFY-NEXT: ret i32 0
@@ -830,10 +824,10 @@ define dso_local i32 @terminator(ptr %P) personality ptr @__gxx_personality_v0 {
830824
; BASIC-SAME: (ptr [[P:%.*]]) personality ptr @__gxx_personality_v0 {
831825
; BASIC-NEXT: bb:
832826
; BASIC-NEXT: invoke void @may_throwv2(ptr nonnull [[P]])
833-
; BASIC-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
827+
; BASIC-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
834828
; BASIC: Catch:
835829
; BASIC-NEXT: [[V:%.*]] = landingpad { ptr, i32 }
836-
; BASIC-NEXT: catch ptr null
830+
; BASIC-NEXT: catch ptr null
837831
; BASIC-NEXT: br label [[EXIT]]
838832
; BASIC: Exit:
839833
; BASIC-NEXT: [[DOT0:%.*]] = phi i32 [ 1, [[BB:%.*]] ], [ 0, [[CATCH]] ]
@@ -843,10 +837,10 @@ define dso_local i32 @terminator(ptr %P) personality ptr @__gxx_personality_v0 {
843837
; ALL-SAME: (ptr [[P:%.*]]) personality ptr @__gxx_personality_v0 {
844838
; ALL-NEXT: bb:
845839
; ALL-NEXT: invoke void @may_throwv2(ptr nonnull [[P]])
846-
; ALL-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
840+
; ALL-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
847841
; ALL: Catch:
848842
; ALL-NEXT: [[V:%.*]] = landingpad { ptr, i32 }
849-
; ALL-NEXT: catch ptr null
843+
; ALL-NEXT: catch ptr null
850844
; ALL-NEXT: br label [[EXIT]]
851845
; ALL: Exit:
852846
; ALL-NEXT: [[DOT0:%.*]] = phi i32 [ 1, [[BB:%.*]] ], [ 0, [[CATCH]] ]
@@ -856,10 +850,10 @@ define dso_local i32 @terminator(ptr %P) personality ptr @__gxx_personality_v0 {
856850
; WITH-AC-SAME: (ptr [[P:%.*]]) personality ptr @__gxx_personality_v0 {
857851
; WITH-AC-NEXT: bb:
858852
; WITH-AC-NEXT: invoke void @may_throwv2(ptr nonnull [[P]])
859-
; WITH-AC-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
853+
; WITH-AC-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
860854
; WITH-AC: Catch:
861855
; WITH-AC-NEXT: [[V:%.*]] = landingpad { ptr, i32 }
862-
; WITH-AC-NEXT: catch ptr null
856+
; WITH-AC-NEXT: catch ptr null
863857
; WITH-AC-NEXT: br label [[EXIT]]
864858
; WITH-AC: Exit:
865859
; WITH-AC-NEXT: [[DOT0:%.*]] = phi i32 [ 1, [[BB:%.*]] ], [ 0, [[CATCH]] ]
@@ -869,10 +863,10 @@ define dso_local i32 @terminator(ptr %P) personality ptr @__gxx_personality_v0 {
869863
; CROSS-BLOCK-SAME: (ptr [[P:%.*]]) personality ptr @__gxx_personality_v0 {
870864
; CROSS-BLOCK-NEXT: bb:
871865
; CROSS-BLOCK-NEXT: invoke void @may_throwv2(ptr nonnull [[P]])
872-
; CROSS-BLOCK-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
866+
; CROSS-BLOCK-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
873867
; CROSS-BLOCK: Catch:
874868
; CROSS-BLOCK-NEXT: [[V:%.*]] = landingpad { ptr, i32 }
875-
; CROSS-BLOCK-NEXT: catch ptr null
869+
; CROSS-BLOCK-NEXT: catch ptr null
876870
; CROSS-BLOCK-NEXT: br label [[EXIT]]
877871
; CROSS-BLOCK: Exit:
878872
; CROSS-BLOCK-NEXT: [[DOT0:%.*]] = phi i32 [ 1, [[BB:%.*]] ], [ 0, [[CATCH]] ]
@@ -882,10 +876,10 @@ define dso_local i32 @terminator(ptr %P) personality ptr @__gxx_personality_v0 {
882876
; FULL-SIMPLIFY-SAME: (ptr [[P:%.*]]) personality ptr @__gxx_personality_v0 {
883877
; FULL-SIMPLIFY-NEXT: bb:
884878
; FULL-SIMPLIFY-NEXT: invoke void @may_throwv2(ptr nonnull [[P]])
885-
; FULL-SIMPLIFY-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
879+
; FULL-SIMPLIFY-NEXT: to label [[EXIT:%.*]] unwind label [[CATCH:%.*]]
886880
; FULL-SIMPLIFY: Catch:
887881
; FULL-SIMPLIFY-NEXT: [[V:%.*]] = landingpad { ptr, i32 }
888-
; FULL-SIMPLIFY-NEXT: catch ptr null
882+
; FULL-SIMPLIFY-NEXT: catch ptr null
889883
; FULL-SIMPLIFY-NEXT: br label [[EXIT]]
890884
; FULL-SIMPLIFY: Exit:
891885
; FULL-SIMPLIFY-NEXT: [[DOT0:%.*]] = phi i32 [ 1, [[BB:%.*]] ], [ 0, [[CATCH]] ]

0 commit comments

Comments
 (0)