Skip to content

Commit 3e8c436

Browse files
committed
[Attributor] Visit droppable uses in AAIsDead
If we ignore droppable users everything only used in llvm.assume (among other things) is going to be deleted as dead. This is not helpful. Instead we want to only delete things we actually don't need anymore. A follow up will deal with loads in a smarter way.
1 parent dd92b29 commit 3e8c436

File tree

5 files changed

+54
-21
lines changed

5 files changed

+54
-21
lines changed

llvm/include/llvm/Transforms/IPO/Attributor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,6 +1695,7 @@ struct Attributor {
16951695
const AbstractAttribute &QueryingAA, const Value &V,
16961696
bool CheckBBLivenessOnly = false,
16971697
DepClassTy LivenessDepClass = DepClassTy::OPTIONAL,
1698+
bool IgnoreDroppableUses = true,
16981699
function_ref<bool(const Use &OldU, const Use &NewU)>
16991700
EquivalentUseCB = nullptr);
17001701

llvm/lib/Transforms/IPO/Attributor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,7 @@ bool Attributor::checkForAllUses(
12611261
function_ref<bool(const Use &, bool &)> Pred,
12621262
const AbstractAttribute &QueryingAA, const Value &V,
12631263
bool CheckBBLivenessOnly, DepClassTy LivenessDepClass,
1264+
bool IgnoreDroppableUses,
12641265
function_ref<bool(const Use &OldU, const Use &NewU)> EquivalentUseCB) {
12651266

12661267
// Check the trivial case first as it catches void values.
@@ -1301,7 +1302,7 @@ bool Attributor::checkForAllUses(
13011302
LLVM_DEBUG(dbgs() << "[Attributor] Dead use, skip!\n");
13021303
continue;
13031304
}
1304-
if (U->getUser()->isDroppable()) {
1305+
if (IgnoreDroppableUses && U->getUser()->isDroppable()) {
13051306
LLVM_DEBUG(dbgs() << "[Attributor] Droppable user, skip!\n");
13061307
continue;
13071308
}

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,7 +1511,7 @@ struct AAPointerInfoFloating : public AAPointerInfoImpl {
15111511
};
15121512
if (!A.checkForAllUses(UsePred, *this, AssociatedValue,
15131513
/* CheckBBLivenessOnly */ true, DepClassTy::OPTIONAL,
1514-
EquivalentUseCB))
1514+
/* IgnoreDroppableUses */ true, EquivalentUseCB))
15151515
return indicatePessimisticFixpoint();
15161516

15171517
LLVM_DEBUG({
@@ -3530,7 +3530,8 @@ struct AAIsDeadValueImpl : public AAIsDead {
35303530
// without going through N update cycles. This is not required for
35313531
// correctness.
35323532
return A.checkForAllUses(UsePred, *this, V, /* CheckBBLivenessOnly */ false,
3533-
DepClassTy::REQUIRED);
3533+
DepClassTy::REQUIRED,
3534+
/* IgnoreDroppableUses */ false);
35343535
}
35353536

35363537
/// Determine if \p I is assumed to be side-effect free.

llvm/test/Transforms/Attributor/nonnull.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,14 +318,16 @@ define i8* @test10(i8* %a, i64 %n) {
318318
; NOT_CGSCC_NPM: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
319319
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@test10
320320
; NOT_CGSCC_NPM-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]]) #[[ATTR2]] {
321-
; NOT_CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]]
321+
; NOT_CGSCC_NPM-NEXT: [[CMP:%.*]] = icmp ne i64 [[N]], 0
322+
; NOT_CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR13]]
322323
; NOT_CGSCC_NPM-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]
323324
; NOT_CGSCC_NPM-NEXT: ret i8* [[B]]
324325
;
325326
; IS__CGSCC_NPM: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
326327
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test10
327328
; IS__CGSCC_NPM-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]]) #[[ATTR2]] {
328-
; IS__CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR12]]
329+
; IS__CGSCC_NPM-NEXT: [[CMP:%.*]] = icmp ne i64 [[N]], 0
330+
; IS__CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR12]]
329331
; IS__CGSCC_NPM-NEXT: [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]
330332
; IS__CGSCC_NPM-NEXT: ret i8* [[B]]
331333
;

llvm/test/Transforms/Attributor/value-simplify-assume.ll

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ define void @assume_1b_nr(i1 %arg, i1 %cond) norecurse {
242242
; CHECK: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
243243
; CHECK-LABEL: define {{[^@]+}}@assume_1b_nr
244244
; CHECK-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
245+
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
246+
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
245247
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
246248
; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
247249
; CHECK: t:
@@ -303,13 +305,18 @@ define void @assume_2b_nr(i1 %arg, i1 %cond) norecurse {
303305
; CHECK: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
304306
; CHECK-LABEL: define {{[^@]+}}@assume_2b_nr
305307
; CHECK-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
308+
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
309+
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
306310
; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
307311
; CHECK: t:
312+
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
308313
; CHECK-NEXT: br label [[M:%.*]]
309314
; CHECK: f:
315+
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
310316
; CHECK-NEXT: br label [[M]]
311317
; CHECK: m:
312-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
318+
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
319+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
313320
; CHECK-NEXT: ret void
314321
;
315322
%stack = alloca i1
@@ -375,7 +382,8 @@ define i1 @assume_4_nr(i1 %arg, i1 %cond) norecurse {
375382
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
376383
; CHECK-NEXT: br label [[M]]
377384
; CHECK: m:
378-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
385+
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
386+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
379387
; CHECK-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
380388
; CHECK-NEXT: ret i1 [[R]]
381389
;
@@ -405,14 +413,17 @@ define i1 @assume_5_nr(i1 %arg, i1 %cond) norecurse {
405413
; IS________OPM-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
406414
; IS________OPM: t:
407415
; IS________OPM-NEXT: store i1 true, i1* [[STACK]], align 1
408-
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
416+
; IS________OPM-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
417+
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
409418
; IS________OPM-NEXT: br label [[M:%.*]]
410419
; IS________OPM: f:
411420
; IS________OPM-NEXT: store i1 false, i1* [[STACK]], align 1
412-
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
421+
; IS________OPM-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
422+
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
413423
; IS________OPM-NEXT: br label [[M]]
414424
; IS________OPM: m:
415-
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
425+
; IS________OPM-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
426+
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
416427
; IS________OPM-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
417428
; IS________OPM-NEXT: ret i1 [[R]]
418429
;
@@ -432,7 +443,8 @@ define i1 @assume_5_nr(i1 %arg, i1 %cond) norecurse {
432443
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef false) #[[ATTR4]]
433444
; IS________NPM-NEXT: br label [[M]]
434445
; IS________NPM: m:
435-
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
446+
; IS________NPM-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
447+
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
436448
; IS________NPM-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
437449
; IS________NPM-NEXT: ret i1 [[R]]
438450
;
@@ -472,10 +484,12 @@ define i1 @assume_5c_nr(i1 %cond) norecurse {
472484
; IS________OPM-NEXT: br label [[M:%.*]]
473485
; IS________OPM: f:
474486
; IS________OPM-NEXT: store i1 false, i1* [[STACK]], align 1
475-
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
487+
; IS________OPM-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
488+
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
476489
; IS________OPM-NEXT: br label [[M]]
477490
; IS________OPM: m:
478-
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
491+
; IS________OPM-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
492+
; IS________OPM-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
479493
; IS________OPM-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
480494
; IS________OPM-NEXT: ret i1 [[R]]
481495
;
@@ -495,7 +509,8 @@ define i1 @assume_5c_nr(i1 %cond) norecurse {
495509
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef false) #[[ATTR4]]
496510
; IS________NPM-NEXT: br label [[M]]
497511
; IS________NPM: m:
498-
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
512+
; IS________NPM-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
513+
; IS________NPM-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
499514
; IS________NPM-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
500515
; IS________NPM-NEXT: ret i1 [[R]]
501516
;
@@ -733,6 +748,8 @@ define void @assume_1b(i1 %arg, i1 %cond) {
733748
; CHECK: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
734749
; CHECK-LABEL: define {{[^@]+}}@assume_1b
735750
; CHECK-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
751+
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
752+
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
736753
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR4]]
737754
; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
738755
; CHECK: t:
@@ -794,13 +811,18 @@ define void @assume_2b(i1 %arg, i1 %cond) {
794811
; CHECK: Function Attrs: inaccessiblememonly nofree norecurse nosync nounwind willreturn
795812
; CHECK-LABEL: define {{[^@]+}}@assume_2b
796813
; CHECK-SAME: (i1 [[ARG:%.*]], i1 [[COND:%.*]]) #[[ATTR3]] {
814+
; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1
815+
; CHECK-NEXT: store i1 [[ARG]], i1* [[STACK]], align 1
797816
; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
798817
; CHECK: t:
818+
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
799819
; CHECK-NEXT: br label [[M:%.*]]
800820
; CHECK: f:
821+
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
801822
; CHECK-NEXT: br label [[M]]
802823
; CHECK: m:
803-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
824+
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
825+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
804826
; CHECK-NEXT: ret void
805827
;
806828
%stack = alloca i1
@@ -866,7 +888,8 @@ define i1 @assume_4(i1 %arg, i1 %cond) {
866888
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
867889
; CHECK-NEXT: br label [[M]]
868890
; CHECK: m:
869-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
891+
; CHECK-NEXT: [[L:%.*]] = load i1, i1* [[STACK]], align 1
892+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR4]]
870893
; CHECK-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
871894
; CHECK-NEXT: ret i1 [[R]]
872895
;
@@ -896,14 +919,17 @@ define i1 @assume_5(i1 %arg, i1 %cond) {
896919
; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]]
897920
; CHECK: t:
898921
; CHECK-NEXT: store i1 true, i1* [[STACK]], align 1
899-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
922+
; CHECK-NEXT: [[L2:%.*]] = load i1, i1* [[STACK]], align 1
923+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L2]]) #[[ATTR4]]
900924
; CHECK-NEXT: br label [[M:%.*]]
901925
; CHECK: f:
902926
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
903-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
927+
; CHECK-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
928+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
904929
; CHECK-NEXT: br label [[M]]
905930
; CHECK: m:
906-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
931+
; CHECK-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
932+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
907933
; CHECK-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
908934
; CHECK-NEXT: ret i1 [[R]]
909935
;
@@ -943,10 +969,12 @@ define i1 @assume_5c(i1 %cond) {
943969
; CHECK-NEXT: br label [[M:%.*]]
944970
; CHECK: f:
945971
; CHECK-NEXT: store i1 false, i1* [[STACK]], align 1
946-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
972+
; CHECK-NEXT: [[L3:%.*]] = load i1, i1* [[STACK]], align 1
973+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L3]]) #[[ATTR4]]
947974
; CHECK-NEXT: br label [[M]]
948975
; CHECK: m:
949-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR4]]
976+
; CHECK-NEXT: [[L4:%.*]] = load i1, i1* [[STACK]], align 1
977+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[L4]]) #[[ATTR4]]
950978
; CHECK-NEXT: [[R:%.*]] = call i1 @readI1p(i1* noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR5]]
951979
; CHECK-NEXT: ret i1 [[R]]
952980
;

0 commit comments

Comments
 (0)