[llvm] 4f33d7b - Revert "[ControlHeightReduction] Drop lifetime annotations where necessary (#159686)"
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 22 20:02:12 PDT 2025
Author: Aiden Grossman
Date: 2025-09-23T03:01:46Z
New Revision: 4f33d7b7a9f39d733b7572f9afbf178bca8da127
URL: https://github.com/llvm/llvm-project/commit/4f33d7b7a9f39d733b7572f9afbf178bca8da127
DIFF: https://github.com/llvm/llvm-project/commit/4f33d7b7a9f39d733b7572f9afbf178bca8da127.diff
LOG: Revert "[ControlHeightReduction] Drop lifetime annotations where necessary (#159686)"
This reverts commit a00450944d2a91aba302954556c1c23ae049dfc7.
Looks like this one is actually breaking the buildbots. Reverting the switch back
to IRPGO did not fix things.
Added:
Modified:
llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
Removed:
llvm/test/Transforms/PGOProfile/chr-lifetimes.ll
################################################################################
diff --git a/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp b/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
index 6f6245020ae5c..c14bbecf0d4e1 100644
--- a/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
+++ b/llvm/lib/Transforms/Instrumentation/ControlHeightReduction.cpp
@@ -1591,16 +1591,7 @@ static void insertTrivialPHIs(CHRScope *Scope,
}
TrivialPHIs.insert(PN);
CHR_DEBUG(dbgs() << "Insert phi " << *PN << "\n");
- bool FoundLifetimeAnnotation = false;
for (Instruction *UI : Users) {
- // If we found a lifetime annotation, remove it, but set a flag
- // to ensure that we remove all other lifetime annotations attached
- // to the alloca.
- if (UI->isLifetimeStartOrEnd()) {
- UI->eraseFromParent();
- FoundLifetimeAnnotation = true;
- continue;
- }
for (unsigned J = 0, NumOps = UI->getNumOperands(); J < NumOps; ++J) {
if (UI->getOperand(J) == &I) {
UI->setOperand(J, PN);
@@ -1608,14 +1599,6 @@ static void insertTrivialPHIs(CHRScope *Scope,
}
CHR_DEBUG(dbgs() << "Updated user " << *UI << "\n");
}
- // Erase any leftover lifetime annotations for a dynamic alloca.
- if (FoundLifetimeAnnotation) {
- for (User *U : make_early_inc_range(I.users())) {
- if (auto *UI = dyn_cast<Instruction>(U))
- if (UI->isLifetimeStartOrEnd())
- UI->eraseFromParent();
- }
- }
}
}
}
@@ -1710,12 +1693,14 @@ void CHR::transformScopes(CHRScope *Scope, DenseSet<PHINode *> &TrivialPHIs) {
BasicBlock *ExitBlock = LastRegion->getExit();
std::optional<uint64_t> ProfileCount = BFI.getBlockProfileCount(EntryBlock);
- SmallVector<AllocaInst *> StaticAllocas;
- for (Instruction &I : *EntryBlock) {
- if (auto *AI = dyn_cast<AllocaInst>(&I)) {
- if (AI->isStaticAlloca())
- StaticAllocas.push_back(AI);
- }
+ if (ExitBlock) {
+ // Insert a trivial phi at the exit block (where the CHR hot path and the
+ // cold path merges) for a value that's defined in the scope but used
+ // outside it (meaning it's alive at the exit block). We will add the
+ // incoming values for the CHR cold paths to it below. Without this, we'd
+ // miss updating phi's for such values unless there happens to already be a
+ // phi for that value there.
+ insertTrivialPHIs(Scope, EntryBlock, ExitBlock, TrivialPHIs);
}
// Split the entry block of the first region. The new block becomes the new
@@ -1734,20 +1719,6 @@ void CHR::transformScopes(CHRScope *Scope, DenseSet<PHINode *> &TrivialPHIs) {
FirstRegion->replaceEntryRecursive(NewEntryBlock);
BasicBlock *PreEntryBlock = EntryBlock;
- // Move static allocas into the pre-entry block so they stay static.
- for (AllocaInst *AI : StaticAllocas)
- AI->moveBefore(EntryBlock->getTerminator()->getIterator());
-
- if (ExitBlock) {
- // Insert a trivial phi at the exit block (where the CHR hot path and the
- // cold path merges) for a value that's defined in the scope but used
- // outside it (meaning it's alive at the exit block). We will add the
- // incoming values for the CHR cold paths to it below. Without this, we'd
- // miss updating phi's for such values unless there happens to already be a
- // phi for that value there.
- insertTrivialPHIs(Scope, EntryBlock, ExitBlock, TrivialPHIs);
- }
-
ValueToValueMapTy VMap;
// Clone the blocks in the scope (excluding the PreEntryBlock) to split into a
// hot path (originals) and a cold path (clones) and update the PHIs at the
diff --git a/llvm/test/Transforms/PGOProfile/chr-lifetimes.ll b/llvm/test/Transforms/PGOProfile/chr-lifetimes.ll
deleted file mode 100644
index 4f926237974fc..0000000000000
--- a/llvm/test/Transforms/PGOProfile/chr-lifetimes.ll
+++ /dev/null
@@ -1,178 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -passes='require<profile-summary>,chr' -S | FileCheck %s
-
-declare void @foo()
-declare void @bar()
-declare void @baz(i64)
-
-; Test that when we have a static alloca in an entry block that will get split,
-; the alloca remains static and we preserve its lifetime annotations.
-define void @test_chr_with_lifetimes(ptr %i) !prof !14 {
-; CHECK-LABEL: @test_chr_with_lifetimes(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I:%.*]], align 4
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
-; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 8
-; CHECK-NEXT: [[TMP9:%.*]] = freeze i1 [[TMP1]]
-; CHECK-NEXT: [[TMP10:%.*]] = select i1 true, i1 [[TMP9]], i1 false
-; CHECK-NEXT: [[TMP11:%.*]] = freeze i1 [[TMP1]]
-; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP10]], i1 [[TMP11]], i1 false
-; CHECK-NEXT: br i1 [[TMP5]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_NONCHR:%.*]], !prof [[PROF15:![0-9]+]]
-; CHECK: entry.split:
-; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF16:![0-9]+]]
-; CHECK-NEXT: call void @baz(i64 [[TMP6]])
-; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF17:![0-9]+]]
-; CHECK: bb0:
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: br label [[BB1]]
-; CHECK: entry.split.nonchr:
-; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF16]]
-; CHECK-NEXT: call void @baz(i64 [[TMP7]])
-; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]]
-; CHECK: bb0.nonchr:
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: br label [[BB1]]
-; CHECK: bb1:
-; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TEST]])
-; CHECK-NEXT: store ptr [[TEST]], ptr [[I]], align 8
-; CHECK-NEXT: br label [[BB2:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[TMP3:%.*]], [[BB2]] ], [ null, [[BB1]] ]
-; CHECK-NEXT: [[TMP3]] = getelementptr i8, ptr [[TMP2]], i64 24
-; CHECK-NEXT: [[TMP4:%.*]] = icmp eq ptr [[TMP2]], [[I]]
-; CHECK-NEXT: br i1 [[TMP4]], label [[BB3:%.*]], label [[BB2]]
-; CHECK: bb3:
-; CHECK-NEXT: ret void
-;
-entry:
- %1 = load i32, ptr %i
- %2 = icmp eq i32 %1, 0
- %3 = select i1 %2, i64 4, i64 0, !prof !15
- %test = alloca i32, align 8
- call void @baz(i64 %3)
- br i1 %2, label %bb1, label %bb0, !prof !15
-
-bb0:
- call void @foo()
- br label %bb1
-
-bb1:
- call void @llvm.lifetime.start.p0(ptr %test)
- store ptr %test, ptr %i, align 8
- br label %bb2
-
-bb2:
- %4 = phi ptr [ %5, %bb2 ], [ null, %bb1 ]
- %5 = getelementptr i8, ptr %4, i64 24
- %6 = icmp eq ptr %4, %i
- br i1 %6, label %bb3, label %bb2
-
-bb3:
- ret void
-}
-
-; Test that we remove lifetime markers that would otherwise refer to phi
-; nodes given the dynamic allocas they referred to have been duplicated.
-define void @test_chr_dynamic_alloca(ptr %i) !prof !14 {
-; CHECK-LABEL: @test_chr_dynamic_alloca(
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[TEST1:%.*]] = load i32, ptr [[I:%.*]], align 4
-; CHECK-NEXT: [[TEST2:%.*]] = icmp eq i32 [[TEST1]], 5
-; CHECK-NEXT: br i1 [[TEST2]], label [[BB4:%.*]], label [[BB3:%.*]]
-; CHECK: bb4:
-; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ne i32 [[TMP0]], 0
-; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
-; CHECK-NEXT: [[TMP3:%.*]] = select i1 true, i1 [[TMP2]], i1 false
-; CHECK-NEXT: [[TMP4:%.*]] = freeze i1 [[TMP1]]
-; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP3]], i1 [[TMP4]], i1 false
-; CHECK-NEXT: br i1 [[TMP5]], label [[BB4_SPLIT:%.*]], label [[BB4_SPLIT_NONCHR:%.*]], !prof [[PROF15]]
-; CHECK: bb4.split:
-; CHECK-NEXT: [[TMP6:%.*]] = select i1 true, i64 0, i64 4, !prof [[PROF16]]
-; CHECK-NEXT: [[TEST:%.*]] = alloca i32, align 8
-; CHECK-NEXT: call void @baz(i64 [[TMP6]])
-; CHECK-NEXT: br i1 false, label [[BB1:%.*]], label [[BB0:%.*]], !prof [[PROF17]]
-; CHECK: bb0:
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: store ptr [[TEST]], ptr [[I]], align 8
-; CHECK-NEXT: br label [[BB1]]
-; CHECK: bb4.split.nonchr:
-; CHECK-NEXT: [[TMP7:%.*]] = select i1 [[TMP1]], i64 0, i64 4, !prof [[PROF16]]
-; CHECK-NEXT: [[TEST_NONCHR:%.*]] = alloca i32, align 8
-; CHECK-NEXT: call void @baz(i64 [[TMP7]])
-; CHECK-NEXT: br i1 [[TMP1]], label [[BB0_NONCHR:%.*]], label [[BB1]], !prof [[PROF16]]
-; CHECK: bb0.nonchr:
-; CHECK-NEXT: call void @foo()
-; CHECK-NEXT: store ptr [[TEST_NONCHR]], ptr [[I]], align 8
-; CHECK-NEXT: br label [[BB1]]
-; CHECK: bb1:
-; CHECK-NEXT: [[TMP8:%.*]] = phi ptr [ [[TEST]], [[BB0]] ], [ [[TEST]], [[BB4_SPLIT]] ], [ [[TEST_NONCHR]], [[BB0_NONCHR]] ], [ [[TEST_NONCHR]], [[BB4_SPLIT_NONCHR]] ]
-; CHECK-NEXT: call void @bar()
-; CHECK-NEXT: store ptr [[TMP8]], ptr [[I]], align 8
-; CHECK-NEXT: br label [[BB2:%.*]]
-; CHECK: bb2:
-; CHECK-NEXT: [[TMP9:%.*]] = phi ptr [ [[TMP10:%.*]], [[BB2]] ], [ null, [[BB1]] ]
-; CHECK-NEXT: [[TMP10]] = getelementptr i8, ptr [[TMP9]], i64 24
-; CHECK-NEXT: [[TEST5:%.*]] = load ptr, ptr [[TMP8]], align 8
-; CHECK-NEXT: [[TMP11:%.*]] = icmp eq ptr [[TMP9]], [[TEST5]]
-; CHECK-NEXT: br i1 [[TMP11]], label [[BB3]], label [[BB2]]
-; CHECK: bb3:
-; CHECK-NEXT: ret void
-;
-entry:
- %test1 = load i32, ptr %i
- %test2 = icmp eq i32 %test1, 5
- br i1 %test2, label %bb4, label %bb3
-
-bb4:
- %1 = load i32, ptr %i
- %2 = icmp eq i32 %1, 0
- %3 = select i1 %2, i64 4, i64 0, !prof !15
- %test = alloca i32, align 8
- call void @baz(i64 %3)
- br i1 %2, label %bb1, label %bb0, !prof !15
-
-bb0:
- call void @foo()
- call void @llvm.lifetime.start.p0(ptr %test)
- store ptr %test, ptr %i, align 8
- br label %bb1
-
-bb1:
- call void @bar()
- call void @llvm.lifetime.start.p0(ptr %test)
- store ptr %test, ptr %i, align 8
- br label %bb2
-
-bb2:
- %4 = phi ptr [ %5, %bb2 ], [ null, %bb1 ]
- %5 = getelementptr i8, ptr %4, i64 24
- %test5 = load ptr, ptr %test
- call void @llvm.lifetime.end.p0(ptr %test)
- %6 = icmp eq ptr %4, %test5
- br i1 %6, label %bb3, label %bb2
-
-bb3:
- ret void
-}
-
-
-!llvm.module.flags = !{!0}
-!0 = !{i32 1, !"ProfileSummary", !1}
-!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
-!2 = !{!"ProfileFormat", !"InstrProf"}
-!3 = !{!"TotalCount", i64 10000}
-!4 = !{!"MaxCount", i64 10}
-!5 = !{!"MaxInternalCount", i64 1}
-!6 = !{!"MaxFunctionCount", i64 1000}
-!7 = !{!"NumCounts", i64 3}
-!8 = !{!"NumFunctions", i64 3}
-!9 = !{!"DetailedSummary", !10}
-!10 = !{!11, !12, !13}
-!11 = !{i32 10000, i64 100, i32 1}
-!12 = !{i32 999000, i64 100, i32 1}
-!13 = !{i32 999999, i64 1, i32 2}
-
-!14 = !{!"function_entry_count", i64 100}
-!15 = !{!"branch_weights", i32 0, i32 1}
-; CHECK: !15 = !{!"branch_weights", i32 1000, i32 0}
More information about the llvm-commits
mailing list