https://github.com/nimit25 updated https://github.com/llvm/llvm-project/pull/164882
>From a05e8f9ca277e3ca6bcb6869a6adcf3bceeb4b7b Mon Sep 17 00:00:00 2001 From: Nimit Sachdeva <[email protected]> Date: Thu, 23 Oct 2025 15:58:35 -0400 Subject: [PATCH 1/3] #150120 Introduce MoveEntryAllocaInit pass --- .../llvm/Transforms/Utils/MoveAutoInit.h | 6 +++ llvm/lib/Passes/PassBuilderPipelines.cpp | 2 + llvm/lib/Passes/PassRegistry.def | 1 + llvm/lib/Transforms/Utils/MoveAutoInit.cpp | 27 ++++++++-- llvm/test/Other/new-pm-defaults.ll | 1 + llvm/test/Other/new-pm-lto-defaults.ll | 1 + .../Other/new-pm-thinlto-postlink-defaults.ll | 1 + .../new-pm-thinlto-postlink-pgo-defaults.ll | 1 + ...-pm-thinlto-postlink-samplepgo-defaults.ll | 1 + .../Other/new-pm-thinlto-prelink-defaults.ll | 1 + .../new-pm-thinlto-prelink-pgo-defaults.ll | 1 + ...w-pm-thinlto-prelink-samplepgo-defaults.ll | 1 + .../Transforms/MoveAutoInit/entry-alloca.ll | 50 +++++++++++++++++++ 13 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/MoveAutoInit/entry-alloca.ll diff --git a/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h b/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h index 980b55f46f114..e8565e6942bc2 100644 --- a/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h +++ b/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h @@ -24,6 +24,12 @@ class MoveAutoInitPass : public PassInfoMixin<MoveAutoInitPass> { public: PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; + +/// Move entry block initializations of allocas closer to their guarded users. +class MoveEntryAllocaInitPass : public PassInfoMixin<MoveEntryAllocaInitPass> { +public: + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); +}; } // end namespace llvm #endif // LLVM_TRANSFORMS_UTILS_MOVEAUTOINIT_H diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp index bd03ac090721c..470bc0afa22d7 100644 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -765,6 +765,7 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level, FPM.addPass(DSEPass()); FPM.addPass(MoveAutoInitPass()); + FPM.addPass(MoveEntryAllocaInitPass()); FPM.addPass(createFunctionToLoopPassAdaptor( LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap, @@ -2140,6 +2141,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, // Nuke dead stores. MainFPM.addPass(DSEPass()); MainFPM.addPass(MoveAutoInitPass()); + MainFPM.addPass(MoveEntryAllocaInitPass()); MainFPM.addPass(MergedLoadStoreMotionPass()); invokeVectorizerStartEPCallbacks(MainFPM, Level); diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 1853cdd45d0ee..7950040cd3623 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -485,6 +485,7 @@ FUNCTION_PASS("memprof", MemProfilerPass()) FUNCTION_PASS("mergeicmps", MergeICmpsPass()) FUNCTION_PASS("mergereturn", UnifyFunctionExitNodesPass()) FUNCTION_PASS("move-auto-init", MoveAutoInitPass()) +FUNCTION_PASS("move-entry-alloca-init", MoveEntryAllocaInitPass()) FUNCTION_PASS("nary-reassociate", NaryReassociatePass()) FUNCTION_PASS("newgvn", NewGVNPass()) FUNCTION_PASS("no-op-function", NoOpFunctionPass()) diff --git a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp index ad105f5a57b49..b9993dfe56577 100644 --- a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp +++ b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp @@ -101,7 +101,9 @@ static BasicBlock *usersDominator(const MemoryLocation &ML, Instruction *I, return CurrentDominator; } -static bool runMoveAutoInit(Function &F, DominatorTree &DT, MemorySSA &MSSA) { +static bool runMoveAutoInit( + Function &F, DominatorTree &DT, MemorySSA &MSSA, + function_ref<bool(const Instruction &)> ShouldProcess) { BasicBlock &EntryBB = F.getEntryBlock(); SmallVector<std::pair<Instruction *, BasicBlock *>> JobList; @@ -109,7 +111,7 @@ static bool runMoveAutoInit(Function &F, DominatorTree &DT, MemorySSA &MSSA) { // Compute movable instructions. // for (Instruction &I : EntryBB) { - if (!hasAutoInitMetadata(I)) + if (!ShouldProcess(I)) continue; std::optional<MemoryLocation> ML = writeToAlloca(I); @@ -221,7 +223,26 @@ PreservedAnalyses MoveAutoInitPass::run(Function &F, auto &DT = AM.getResult<DominatorTreeAnalysis>(F); auto &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA(); - if (!runMoveAutoInit(F, DT, MSSA)) + auto ShouldProcess = [](const Instruction &I) -> bool { + return hasAutoInitMetadata(I); + }; + if (!runMoveAutoInit(F, DT, MSSA, ShouldProcess)) + return PreservedAnalyses::all(); + + PreservedAnalyses PA; + PA.preserve<DominatorTreeAnalysis>(); + PA.preserve<MemorySSAAnalysis>(); + PA.preserveSet<CFGAnalyses>(); + return PA; +} + +PreservedAnalyses MoveEntryAllocaInitPass::run(Function &F, + FunctionAnalysisManager &AM) { + + auto &DT = AM.getResult<DominatorTreeAnalysis>(F); + auto &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA(); + auto ShouldProcess = [](const Instruction &) { return true; }; + if (!runMoveAutoInit(F, DT, MSSA, ShouldProcess)) return PreservedAnalyses::all(); PreservedAnalyses PA; diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll index 65b96c8b8ef5d..0bc59cbffa594 100644 --- a/llvm/test/Other/new-pm-defaults.ll +++ b/llvm/test/Other/new-pm-defaults.ll @@ -218,6 +218,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-lto-defaults.ll b/llvm/test/Other/new-pm-lto-defaults.ll index f595dfe1d6845..4ce7a968fe3b2 100644 --- a/llvm/test/Other/new-pm-lto-defaults.ll +++ b/llvm/test/Other/new-pm-lto-defaults.ll @@ -118,6 +118,7 @@ ; CHECK-O23SZ-NEXT: Running analysis: PostDominatorTreeAnalysis on foo ; CHECK-O23SZ-NEXT: Running pass: DSEPass on foo ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: MergedLoadStoreMotionPass on foo ; CHECK-EP-VECTORIZER-START-NEXT: Running pass: NoOpFunctionPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass on foo diff --git a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll index 3a0fffe426da1..6f94522401396 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll @@ -143,6 +143,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass on loop diff --git a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll index 4623edcaf6656..05321565e2c2d 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll @@ -127,6 +127,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll index 590afd925e841..c0a6b3851b376 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll @@ -136,6 +136,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll index dd6acd2c51ee7..280f36749850c 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll @@ -175,6 +175,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass on loop diff --git a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll index ee054527e20bd..b719045f890a4 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll @@ -176,6 +176,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll index fd95e94f3c8b9..3d73e3ca2c2b7 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll @@ -140,6 +140,7 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo +; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll b/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll new file mode 100644 index 0000000000000..31906551e60fc --- /dev/null +++ b/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll @@ -0,0 +1,50 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -passes='move-entry-alloca-init' -verify-memoryssa -S < %s | FileCheck %s + +declare void @bar(ptr) + +define void @src(i32 %a, i32 %b) { +; CHECK-LABEL: define void @src( +; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) { +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32 +; CHECK-NEXT: [[B_ADDR:%.*]] = alloca i32 +; CHECK-NEXT: [[S_ADDR:%.*]] = alloca { ptr, ptr } +; CHECK: [[S_X:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[S_ADDR]], i32 0, i32 0 +; CHECK: [[S_Y:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[S_ADDR]], i32 0, i32 1 +; CHECK: [[CMP:%.*]] = icmp slt i32 [[A]], [[B]] +; CHECK: br i1 [[CMP]], label [[COLD:%.*]], label [[RET:%.*]] +; +; CHECK: cold: +; CHECK-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 4 +; CHECK-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 4 +; CHECK-NEXT: store ptr [[A_ADDR]], ptr [[S_X]], align 8 +; CHECK-NEXT: store ptr [[B_ADDR]], ptr [[S_Y]], align 8 +; CHECK-NEXT: call void @bar(ptr [[S_ADDR]]) +; CHECK-NEXT: br label [[RET]] +; +; CHECK: ret: +; CHECK-NEXT: ret void +; + %a.addr = alloca i32 + %b.addr = alloca i32 + %s.addr = alloca { ptr, ptr } + + store i32 %a, ptr %a.addr + store i32 %b, ptr %b.addr + + %s.x = getelementptr inbounds { ptr, ptr }, ptr %s.addr, i32 0, i32 0 + store ptr %a.addr, ptr %s.x + + %s.y = getelementptr inbounds { ptr, ptr }, ptr %s.addr, i32 0, i32 1 + store ptr %b.addr, ptr %s.y + + %cmp = icmp slt i32 %a, %b + br i1 %cmp, label %cold, label %ret + +cold: + call void @bar(ptr %s.addr) + br label %ret + +ret: + ret void +} >From 1a0c420dc0bcf7641fb566f3509cdd19dd160611 Mon Sep 17 00:00:00 2001 From: Nimit Sachdeva <[email protected]> Date: Thu, 23 Oct 2025 16:07:12 -0400 Subject: [PATCH 2/3] format change --- llvm/lib/Transforms/Utils/MoveAutoInit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp index b9993dfe56577..0881ea12c2478 100644 --- a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp +++ b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp @@ -101,9 +101,9 @@ static BasicBlock *usersDominator(const MemoryLocation &ML, Instruction *I, return CurrentDominator; } -static bool runMoveAutoInit( - Function &F, DominatorTree &DT, MemorySSA &MSSA, - function_ref<bool(const Instruction &)> ShouldProcess) { +static bool +runMoveAutoInit(Function &F, DominatorTree &DT, MemorySSA &MSSA, + function_ref<bool(const Instruction &)> ShouldProcess) { BasicBlock &EntryBB = F.getEntryBlock(); SmallVector<std::pair<Instruction *, BasicBlock *>> JobList; >From 13cec30bf1a1fdb9df19e9bcfdc31539f9a7f921 Mon Sep 17 00:00:00 2001 From: Nimit Sachdeva <[email protected]> Date: Tue, 2 Dec 2025 23:45:55 -0500 Subject: [PATCH 3/3] refactor pass --- clang/test/CodeGen/attr-counted-by.c | 15 ++++++++------- .../llvm/Transforms/Utils/MoveAutoInit.h | 6 ------ llvm/lib/Passes/PassBuilderPipelines.cpp | 2 -- llvm/lib/Passes/PassRegistry.def | 1 - llvm/lib/Transforms/Utils/MoveAutoInit.cpp | 19 ++----------------- llvm/test/Other/new-pm-defaults.ll | 1 - llvm/test/Other/new-pm-lto-defaults.ll | 1 - .../Other/new-pm-thinlto-postlink-defaults.ll | 1 - .../new-pm-thinlto-postlink-pgo-defaults.ll | 1 - ...-pm-thinlto-postlink-samplepgo-defaults.ll | 1 - .../Other/new-pm-thinlto-prelink-defaults.ll | 1 - .../new-pm-thinlto-prelink-pgo-defaults.ll | 1 - ...w-pm-thinlto-prelink-samplepgo-defaults.ll | 1 - .../Transforms/MoveAutoInit/entry-alloca.ll | 2 +- 14 files changed, 11 insertions(+), 42 deletions(-) diff --git a/clang/test/CodeGen/attr-counted-by.c b/clang/test/CodeGen/attr-counted-by.c index 86c59fb2b14ea..8a7309803df87 100644 --- a/clang/test/CodeGen/attr-counted-by.c +++ b/clang/test/CodeGen/attr-counted-by.c @@ -1198,15 +1198,16 @@ int test12_a, test12_b; // SANITIZE-WITH-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITH-ATTR-NEXT: [[BAZ:%.*]] = alloca [[STRUCT_HANG:%.*]], align 4 // SANITIZE-WITH-ATTR-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[BAZ]]) #[[ATTR9:[0-9]+]] -// SANITIZE-WITH-ATTR-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) [[BAZ]], ptr noundef nonnull align 4 dereferenceable(24) @test12_bar, i64 24, i1 false), !tbaa.struct [[TBAA_STRUCT10:![0-9]+]] // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[INDEX]], 6 -// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[INDEX]] to i64 // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label %[[CONT:.*]], label %[[HANDLER_OUT_OF_BOUNDS:.*]], !prof [[PROF7]], !nosanitize [[META6]] // SANITIZE-WITH-ATTR: [[HANDLER_OUT_OF_BOUNDS]]: +// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[INDEX]] to i64 // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB22:[0-9]+]], i64 [[TMP1]]) #[[ATTR8]], !nosanitize [[META6]] // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META6]] // SANITIZE-WITH-ATTR: [[CONT]]: -// SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[BAZ]], i64 [[TMP1]] +// SANITIZE-WITH-ATTR-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) [[BAZ]], ptr noundef nonnull align 4 dereferenceable(24) @test12_bar, i64 24, i1 false), !tbaa.struct [[TBAA_STRUCT10:![0-9]+]] +// SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = zext nneg i32 [[INDEX]] to i64 +// SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[BAZ]], i64 [[TMP2:%.*]] // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[INT_TBAA2]] // SANITIZE-WITH-ATTR-NEXT: store i32 [[TMP2]], ptr @test12_b, align 4, !tbaa [[INT_TBAA2]] // SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_LOAD:%.*]] = load i32, ptr @test12_foo, align 4 @@ -1240,15 +1241,16 @@ int test12_a, test12_b; // SANITIZE-WITHOUT-ATTR-NEXT: [[ENTRY:.*:]] // SANITIZE-WITHOUT-ATTR-NEXT: [[BAZ:%.*]] = alloca [[STRUCT_HANG:%.*]], align 4 // SANITIZE-WITHOUT-ATTR-NEXT: call void @llvm.lifetime.start.p0(ptr nonnull [[BAZ]]) #[[ATTR7:[0-9]+]] -// SANITIZE-WITHOUT-ATTR-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) [[BAZ]], ptr noundef nonnull align 4 dereferenceable(24) @test12_bar, i64 24, i1 false), !tbaa.struct [[TBAA_STRUCT7:![0-9]+]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[INDEX]], 6 -// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[INDEX]] to i64 // SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP0]], label %[[CONT:.*]], label %[[HANDLER_OUT_OF_BOUNDS:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META9:![0-9]+]] // SANITIZE-WITHOUT-ATTR: [[HANDLER_OUT_OF_BOUNDS]]: +// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[INDEX]] to i64 // SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 [[TMP1]]) #[[ATTR8:[0-9]+]], !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]] // SANITIZE-WITHOUT-ATTR: [[CONT]]: -// SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[BAZ]], i64 [[TMP1]] +// SANITIZE-WITHOUT-ATTR-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 4 dereferenceable(24) [[BAZ]], ptr noundef nonnull align 4 dereferenceable(24) @test12_bar, i64 24, i1 false), !tbaa.struct [[TBAA_STRUCT10:![0-9]+]] +// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP2:%.*]] = zext nneg i32 [[INDEX]] to i64 +// SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[BAZ]], i64 [[TMP2]] // SANITIZE-WITHOUT-ATTR-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX]], align 4, !tbaa [[INT_TBAA2]] // SANITIZE-WITHOUT-ATTR-NEXT: store i32 [[TMP2]], ptr @test12_b, align 4, !tbaa [[INT_TBAA2]] // SANITIZE-WITHOUT-ATTR-NEXT: [[DOTCOUNTED_BY_LOAD:%.*]] = load i32, ptr @test12_foo, align 4 @@ -2524,7 +2526,6 @@ size_t test37(struct annotated *ptr) { // SANITIZE-WITHOUT-ATTR: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} // SANITIZE-WITHOUT-ATTR: [[META5]] = !{!"Simple C/C++ TBAA"} // SANITIZE-WITHOUT-ATTR: [[CHAR_TBAA6]] = !{[[META4]], [[META4]], i64 0} -// SANITIZE-WITHOUT-ATTR: [[TBAA_STRUCT7]] = !{i64 0, i64 24, [[CHAR_TBAA6]]} // SANITIZE-WITHOUT-ATTR: [[PROF8]] = !{!"branch_weights", i32 1048575, i32 1} // SANITIZE-WITHOUT-ATTR: [[META9]] = !{} // SANITIZE-WITHOUT-ATTR: [[PROF10]] = !{!"branch_weights", i32 1, i32 1048575} diff --git a/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h b/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h index e8565e6942bc2..980b55f46f114 100644 --- a/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h +++ b/llvm/include/llvm/Transforms/Utils/MoveAutoInit.h @@ -24,12 +24,6 @@ class MoveAutoInitPass : public PassInfoMixin<MoveAutoInitPass> { public: PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; - -/// Move entry block initializations of allocas closer to their guarded users. -class MoveEntryAllocaInitPass : public PassInfoMixin<MoveEntryAllocaInitPass> { -public: - PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); -}; } // end namespace llvm #endif // LLVM_TRANSFORMS_UTILS_MOVEAUTOINIT_H diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp index 470bc0afa22d7..bd03ac090721c 100644 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -765,7 +765,6 @@ PassBuilder::buildFunctionSimplificationPipeline(OptimizationLevel Level, FPM.addPass(DSEPass()); FPM.addPass(MoveAutoInitPass()); - FPM.addPass(MoveEntryAllocaInitPass()); FPM.addPass(createFunctionToLoopPassAdaptor( LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap, @@ -2141,7 +2140,6 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, // Nuke dead stores. MainFPM.addPass(DSEPass()); MainFPM.addPass(MoveAutoInitPass()); - MainFPM.addPass(MoveEntryAllocaInitPass()); MainFPM.addPass(MergedLoadStoreMotionPass()); invokeVectorizerStartEPCallbacks(MainFPM, Level); diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 7950040cd3623..1853cdd45d0ee 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -485,7 +485,6 @@ FUNCTION_PASS("memprof", MemProfilerPass()) FUNCTION_PASS("mergeicmps", MergeICmpsPass()) FUNCTION_PASS("mergereturn", UnifyFunctionExitNodesPass()) FUNCTION_PASS("move-auto-init", MoveAutoInitPass()) -FUNCTION_PASS("move-entry-alloca-init", MoveEntryAllocaInitPass()) FUNCTION_PASS("nary-reassociate", NaryReassociatePass()) FUNCTION_PASS("newgvn", NewGVNPass()) FUNCTION_PASS("no-op-function", NoOpFunctionPass()) diff --git a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp index 0881ea12c2478..26ceb4dfddb1f 100644 --- a/llvm/lib/Transforms/Utils/MoveAutoInit.cpp +++ b/llvm/lib/Transforms/Utils/MoveAutoInit.cpp @@ -226,23 +226,8 @@ PreservedAnalyses MoveAutoInitPass::run(Function &F, auto ShouldProcess = [](const Instruction &I) -> bool { return hasAutoInitMetadata(I); }; - if (!runMoveAutoInit(F, DT, MSSA, ShouldProcess)) - return PreservedAnalyses::all(); - - PreservedAnalyses PA; - PA.preserve<DominatorTreeAnalysis>(); - PA.preserve<MemorySSAAnalysis>(); - PA.preserveSet<CFGAnalyses>(); - return PA; -} - -PreservedAnalyses MoveEntryAllocaInitPass::run(Function &F, - FunctionAnalysisManager &AM) { - - auto &DT = AM.getResult<DominatorTreeAnalysis>(F); - auto &MSSA = AM.getResult<MemorySSAAnalysis>(F).getMSSA(); - auto ShouldProcess = [](const Instruction &) { return true; }; - if (!runMoveAutoInit(F, DT, MSSA, ShouldProcess)) + if (!runMoveAutoInit(F, DT, MSSA, ShouldProcess) && + !runMoveAutoInit(F, DT, MSSA, [](const Instruction &) { return true; })) return PreservedAnalyses::all(); PreservedAnalyses PA; diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll index 0bc59cbffa594..65b96c8b8ef5d 100644 --- a/llvm/test/Other/new-pm-defaults.ll +++ b/llvm/test/Other/new-pm-defaults.ll @@ -218,7 +218,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-lto-defaults.ll b/llvm/test/Other/new-pm-lto-defaults.ll index 4ce7a968fe3b2..f595dfe1d6845 100644 --- a/llvm/test/Other/new-pm-lto-defaults.ll +++ b/llvm/test/Other/new-pm-lto-defaults.ll @@ -118,7 +118,6 @@ ; CHECK-O23SZ-NEXT: Running analysis: PostDominatorTreeAnalysis on foo ; CHECK-O23SZ-NEXT: Running pass: DSEPass on foo ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: MergedLoadStoreMotionPass on foo ; CHECK-EP-VECTORIZER-START-NEXT: Running pass: NoOpFunctionPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass on foo diff --git a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll index 6f94522401396..3a0fffe426da1 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll @@ -143,7 +143,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass on loop diff --git a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll index 05321565e2c2d..4623edcaf6656 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll @@ -127,7 +127,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll index c0a6b3851b376..590afd925e841 100644 --- a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll @@ -136,7 +136,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll index 280f36749850c..dd6acd2c51ee7 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-defaults.ll @@ -175,7 +175,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass on loop diff --git a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll index b719045f890a4..ee054527e20bd 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-pgo-defaults.ll @@ -176,7 +176,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll index 3d73e3ca2c2b7..fd95e94f3c8b9 100644 --- a/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll +++ b/llvm/test/Other/new-pm-thinlto-prelink-samplepgo-defaults.ll @@ -140,7 +140,6 @@ ; CHECK-O23SZ-NEXT: Running pass: MemCpyOptPass ; CHECK-O23SZ-NEXT: Running pass: DSEPass ; CHECK-O23SZ-NEXT: Running pass: MoveAutoInitPass on foo -; CHECK-O23SZ-NEXT: Running pass: MoveEntryAllocaInitPass on foo ; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass ; CHECK-O23SZ-NEXT: Running pass: LCSSAPass ; CHECK-O23SZ-NEXT: Running pass: LICMPass diff --git a/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll b/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll index 31906551e60fc..1d30096d11273 100644 --- a/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll +++ b/llvm/test/Transforms/MoveAutoInit/entry-alloca.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 -; RUN: opt -passes='move-entry-alloca-init' -verify-memoryssa -S < %s | FileCheck %s +; RUN: opt -passes='move-auto-init' -verify-memoryssa -S < %s | FileCheck %s declare void @bar(ptr) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
