Skip to content

Commit 11a3f04

Browse files
committed
[Utils] Make -assume-builder/-assume-simplify actually work on Old-PM
clang w/ old-pm currently would simply crash when -mllvm -enable-knowledge-retention=true is specified. Clearly, these two passes had no Old-PM test coverage, which would have shown the problem - not requiring AssumptionCacheTracker, but then trying to always get it. Also, why try to get domtree only if it's cached, but at the same time marking it as required?
1 parent 45b5c79 commit 11a3f04

File tree

5 files changed

+97
-28
lines changed

5 files changed

+97
-28
lines changed

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ void initializeAliasSetPrinterPass(PassRegistry&);
7272
void initializeAlignmentFromAssumptionsPass(PassRegistry&);
7373
void initializeAlwaysInlinerLegacyPassPass(PassRegistry&);
7474
void initializeAssumeSimplifyPassLegacyPassPass(PassRegistry &);
75+
void initializeAssumeBuilderPassLegacyPassPass(PassRegistry &);
7576
void initializeOpenMPOptLegacyPassPass(PassRegistry &);
7677
void initializeArgPromotionPass(PassRegistry&);
7778
void initializeAssumptionCacheTrackerPass(PassRegistry&);

llvm/lib/Transforms/Utils/AssumeBundleBuilder.cpp

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,14 +525,16 @@ class AssumeSimplifyPassLegacyPass : public FunctionPass {
525525
bool runOnFunction(Function &F) override {
526526
if (skipFunction(F) || !EnableKnowledgeRetention)
527527
return false;
528-
DominatorTreeWrapperPass *DT =
529-
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
530528
AssumptionCache &AC =
531529
getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
532-
return simplifyAssumes(F, &AC, DT ? &DT->getDomTree() : nullptr);
530+
DominatorTreeWrapperPass *DTWP =
531+
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
532+
return simplifyAssumes(F, &AC, DTWP ? &DTWP->getDomTree() : nullptr);
533533
}
534534

535535
void getAnalysisUsage(AnalysisUsage &AU) const override {
536+
AU.addRequired<AssumptionCacheTracker>();
537+
536538
AU.setPreservesAll();
537539
}
538540
};
@@ -542,7 +544,6 @@ char AssumeSimplifyPassLegacyPass::ID = 0;
542544

543545
INITIALIZE_PASS_BEGIN(AssumeSimplifyPassLegacyPass, "assume-simplify",
544546
"Assume Simplify", false, false)
545-
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
546547
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
547548
INITIALIZE_PASS_END(AssumeSimplifyPassLegacyPass, "assume-simplify",
548549
"Assume Simplify", false, false)
@@ -553,9 +554,43 @@ FunctionPass *llvm::createAssumeSimplifyPass() {
553554

554555
PreservedAnalyses AssumeBuilderPass::run(Function &F,
555556
FunctionAnalysisManager &AM) {
556-
AssumptionCache* AC = AM.getCachedResult<AssumptionAnalysis>(F);
557+
AssumptionCache *AC = &AM.getResult<AssumptionAnalysis>(F);
557558
DominatorTree* DT = AM.getCachedResult<DominatorTreeAnalysis>(F);
558559
for (Instruction &I : instructions(F))
559560
salvageKnowledge(&I, AC, DT);
560561
return PreservedAnalyses::all();
561562
}
563+
564+
namespace {
565+
class AssumeBuilderPassLegacyPass : public FunctionPass {
566+
public:
567+
static char ID;
568+
569+
AssumeBuilderPassLegacyPass() : FunctionPass(ID) {
570+
initializeAssumeBuilderPassLegacyPassPass(*PassRegistry::getPassRegistry());
571+
}
572+
bool runOnFunction(Function &F) override {
573+
AssumptionCache &AC =
574+
getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
575+
DominatorTreeWrapperPass *DTWP =
576+
getAnalysisIfAvailable<DominatorTreeWrapperPass>();
577+
for (Instruction &I : instructions(F))
578+
salvageKnowledge(&I, &AC, DTWP ? &DTWP->getDomTree() : nullptr);
579+
return true;
580+
}
581+
582+
void getAnalysisUsage(AnalysisUsage &AU) const override {
583+
AU.addRequired<AssumptionCacheTracker>();
584+
585+
AU.setPreservesAll();
586+
}
587+
};
588+
} // namespace
589+
590+
char AssumeBuilderPassLegacyPass::ID = 0;
591+
592+
INITIALIZE_PASS_BEGIN(AssumeBuilderPassLegacyPass, "assume-builder",
593+
"Assume Builder", false, false)
594+
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
595+
INITIALIZE_PASS_END(AssumeBuilderPassLegacyPass, "assume-builder",
596+
"Assume Builder", false, false)

llvm/lib/Transforms/Utils/Utils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ using namespace llvm;
2525
void llvm::initializeTransformUtils(PassRegistry &Registry) {
2626
initializeAddDiscriminatorsLegacyPassPass(Registry);
2727
initializeAssumeSimplifyPassLegacyPassPass(Registry);
28+
initializeAssumeBuilderPassLegacyPassPass(Registry);
2829
initializeBreakCriticalEdgesPass(Registry);
2930
initializeCanonicalizeAliasesLegacyPassPass(Registry);
3031
initializeCanonicalizeFreezeInLoopsPass(Registry);

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

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2+
; RUN: opt -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=BASIC
3+
; RUN: opt -assume-builder -verify --enable-knowledge-retention --assume-preserve-all -S %s | FileCheck %s --check-prefixes=ALL
4+
; RUN: opt -assumption-cache-tracker -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=WITH-AC
5+
; RUN: opt -domtree -assumption-cache-tracker -assume-builder -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK,CROSS-BLOCK-OLDPM
6+
; RUN: opt -assume-builder -domtree -assumption-cache-tracker -assume-simplify -verify --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=FULL-SIMPLIFY
7+
28
; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=BASIC
39
; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention --assume-preserve-all -S %s | FileCheck %s --check-prefixes=ALL
410
; RUN: opt -passes='require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=WITH-AC
5-
; RUN: opt -passes='require<domtree>,require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK
11+
; RUN: opt -passes='require<domtree>,require<assumptions>,assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=CROSS-BLOCK,CROSS-BLOCK-NEWMP
612
; RUN: opt -passes='assume-builder,require<domtree>,require<assumptions>,assume-simplify,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=FULL-SIMPLIFY
713

814
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
@@ -641,28 +647,30 @@ define dso_local i32 @_Z6squarePi(i32* %P, i32* %P1, i1 %cond) {
641647
; WITH-AC-NEXT: store i32 0, i32* [[P1]], align 4
642648
; WITH-AC-NEXT: ret i32 0
643649
;
644-
; CROSS-BLOCK-LABEL: define {{[^@]+}}@_Z6squarePi
645-
; CROSS-BLOCK-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
646-
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
647-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 4
648-
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
649-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 8
650-
; CROSS-BLOCK-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
651-
; CROSS-BLOCK: A:
652-
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
653-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 8
654-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 4
655-
; CROSS-BLOCK-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
656-
; CROSS-BLOCK: B:
657-
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
658-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 8
659-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 8
660-
; CROSS-BLOCK-NEXT: br label [[C]]
661-
; CROSS-BLOCK: C:
662-
; CROSS-BLOCK-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 32) ]
663-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P]], align 32
664-
; CROSS-BLOCK-NEXT: store i32 0, i32* [[P1]], align 4
665-
; CROSS-BLOCK-NEXT: ret i32 0
650+
; CROSS-BLOCK-OLDPM-LABEL: define {{[^@]+}}@_Z6squarePi
651+
; CROSS-BLOCK-OLDPM-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
652+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
653+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 4
654+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
655+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 8
656+
; CROSS-BLOCK-OLDPM-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
657+
; CROSS-BLOCK-OLDPM: A:
658+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
659+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 8
660+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 4
661+
; CROSS-BLOCK-OLDPM-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
662+
; CROSS-BLOCK-OLDPM: B:
663+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 8) ]
664+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 8
665+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
666+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 8
667+
; CROSS-BLOCK-OLDPM-NEXT: br label [[C]]
668+
; CROSS-BLOCK-OLDPM: C:
669+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 32) ]
670+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P]], align 32
671+
; CROSS-BLOCK-OLDPM-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 4) ]
672+
; CROSS-BLOCK-OLDPM-NEXT: store i32 0, i32* [[P1]], align 4
673+
; CROSS-BLOCK-OLDPM-NEXT: ret i32 0
666674
;
667675
; FULL-SIMPLIFY-LABEL: define {{[^@]+}}@_Z6squarePi
668676
; FULL-SIMPLIFY-SAME: (i32* nonnull align 4 dereferenceable(4) [[P:%.*]], i32* nonnull align 8 dereferenceable(4) [[P1:%.*]], i1 [[COND:%.*]])
@@ -684,6 +692,29 @@ define dso_local i32 @_Z6squarePi(i32* %P, i32* %P1, i1 %cond) {
684692
; FULL-SIMPLIFY-NEXT: store i32 0, i32* [[P]], align 32
685693
; FULL-SIMPLIFY-NEXT: store i32 0, i32* [[P1]], align 4
686694
; FULL-SIMPLIFY-NEXT: ret i32 0
695+
;
696+
; CROSS-BLOCK-NEWMP-LABEL: define {{[^@]+}}@_Z6squarePi
697+
; CROSS-BLOCK-NEWMP-SAME: (i32* [[P:%.*]], i32* [[P1:%.*]], i1 [[COND:%.*]])
698+
; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 4), "nonnull"(i32* [[P]]), "align"(i32* [[P]], i64 4) ]
699+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 4
700+
; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1]], i64 4), "nonnull"(i32* [[P1]]), "align"(i32* [[P1]], i64 8) ]
701+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 8
702+
; CROSS-BLOCK-NEWMP-NEXT: br i1 [[COND]], label [[A:%.*]], label [[B:%.*]]
703+
; CROSS-BLOCK-NEWMP: A:
704+
; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
705+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 8
706+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 4
707+
; CROSS-BLOCK-NEWMP-NEXT: br i1 [[COND]], label [[C:%.*]], label [[B]]
708+
; CROSS-BLOCK-NEWMP: B:
709+
; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 8) ]
710+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 8
711+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 8
712+
; CROSS-BLOCK-NEWMP-NEXT: br label [[C]]
713+
; CROSS-BLOCK-NEWMP: C:
714+
; CROSS-BLOCK-NEWMP-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P]], i64 32) ]
715+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P]], align 32
716+
; CROSS-BLOCK-NEWMP-NEXT: store i32 0, i32* [[P1]], align 4
717+
; CROSS-BLOCK-NEWMP-NEXT: ret i32 0
687718
;
688719
store i32 0, i32* %P, align 4
689720
store i32 0, i32* %P1, align 8

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2+
; RUN: opt -domtree -assumption-cache-tracker -assume-simplify -verify --enable-knowledge-retention -S %s | FileCheck %s
23
; RUN: opt -passes='require<domtree>,require<assumptions>,assume-simplify,verify' --enable-knowledge-retention -S %s | FileCheck %s
34

45
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"

0 commit comments

Comments
 (0)