https://github.com/mtrofin updated https://github.com/llvm/llvm-project/pull/152420
>From f0cf2e9a7ad9b45a6270c727b60e4cd15ea57d27 Mon Sep 17 00:00:00 2001 From: Mircea Trofin <mtro...@google.com> Date: Wed, 6 Aug 2025 17:43:35 -0700 Subject: [PATCH] [ir] MD_prof is not UB-implying --- llvm/lib/IR/Metadata.cpp | 4 ++ .../Transforms/LICM/hoist-phi-metadata.ll | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp index 1157cbe6bbc1b..ba838cd2793ce 100644 --- a/llvm/lib/IR/Metadata.cpp +++ b/llvm/lib/IR/Metadata.cpp @@ -57,6 +57,8 @@ using namespace llvm; +extern cl::opt<bool> ProfcheckDisableMetadataFixes; + MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD) : Value(Ty, MetadataAsValueVal), MD(MD) { track(); @@ -1678,6 +1680,8 @@ void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) { // A DIAssignID attachment is debug metadata, don't drop it. KnownSet.insert(LLVMContext::MD_DIAssignID); + if (!ProfcheckDisableMetadataFixes) + KnownSet.insert(LLVMContext::MD_prof); Value::eraseMetadataIf([&KnownSet](unsigned MDKind, MDNode *Node) { return !KnownSet.count(MDKind); diff --git a/llvm/test/Transforms/LICM/hoist-phi-metadata.ll b/llvm/test/Transforms/LICM/hoist-phi-metadata.ll index e98de9c79ea8c..6034d12d931c2 100644 --- a/llvm/test/Transforms/LICM/hoist-phi-metadata.ll +++ b/llvm/test/Transforms/LICM/hoist-phi-metadata.ll @@ -45,6 +45,46 @@ end: ret void } +declare i32 @getv() + +; indirect.goto.dest2 should get hoisted, and that should not result +; in a loss of profiling info +define i32 @test19(i1 %cond, i1 %cond2, ptr %address, i32 %v1) nounwind { +; CHECK-LABEL: define i32 @test19 +; CHECK-SAME: (i1 [[COND:%.*]], i1 [[COND2:%.*]], ptr [[ADDRESS:%.*]], i32 [[V1:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[INDIRECT_GOTO_DEST:%.*]] = select i1 [[COND]], ptr blockaddress(@test19, [[EXIT:%.*]]), ptr [[ADDRESS]], !prof [[PROF9:![0-9]+]] +; CHECK-NEXT: [[INDIRECT_GOTO_DEST2:%.*]] = select i1 [[COND2]], ptr blockaddress(@test19, [[EXIT]]), ptr [[ADDRESS]], !prof [[PROF10:![0-9]+]] +; CHECK-NEXT: br label [[L0:%.*]] +; CHECK: L0: +; CHECK-NEXT: [[V2:%.*]] = call i32 @getv() +; CHECK-NEXT: [[SINKABLE:%.*]] = mul i32 [[V1]], [[V2]] +; CHECK-NEXT: [[SINKABLE2:%.*]] = add i32 [[V1]], [[V2]] +; CHECK-NEXT: indirectbr ptr [[INDIRECT_GOTO_DEST]], [label [[L1:%.*]], label %exit] +; CHECK: L1: +; CHECK-NEXT: indirectbr ptr [[INDIRECT_GOTO_DEST2]], [label [[L0]], label %exit] +; CHECK: exit: +; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[SINKABLE]], [[L0]] ], [ [[SINKABLE2]], [[L1]] ] +; CHECK-NEXT: ret i32 [[R]] +; +entry: + br label %L0 +L0: + %indirect.goto.dest = select i1 %cond, ptr blockaddress(@test19, %exit), ptr %address, !prof !10 + %v2 = call i32 @getv() + %sinkable = mul i32 %v1, %v2 + %sinkable2 = add i32 %v1, %v2 + indirectbr ptr %indirect.goto.dest, [label %L1, label %exit] + +L1: + %indirect.goto.dest2 = select i1 %cond2, ptr blockaddress(@test19, %exit), ptr %address, !prof !11 + indirectbr ptr %indirect.goto.dest2, [label %L0, label %exit] + +exit: + %r = phi i32 [%sinkable, %L0], [%sinkable2, %L1] + ret i32 %r +} + !llvm.module.flags = !{!2, !3} !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1) @@ -57,6 +97,10 @@ end: !7 = !DILocation(line: 3, column: 22, scope: !4) !8 = !{!"branch_weights", i32 5, i32 7} !9 = !{!"branch_weights", i32 13, i32 11} +!10 = !{!"branch_weights", i32 101, i32 189} +!11 = !{!"branch_weights", i32 67, i32 1} +;. +; CHECK: attributes #[[ATTR0]] = { nounwind } ;. ; CHECK: [[META0:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 5} ; CHECK: [[META1:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3} @@ -67,4 +111,6 @@ end: ; CHECK: [[PROF6]] = !{!"branch_weights", i32 5, i32 7} ; CHECK: [[DBG7]] = !DILocation(line: 3, column: 22, scope: [[META3]]) ; CHECK: [[PROF8]] = !{!"branch_weights", i32 13, i32 11} +; CHECK: [[PROF9]] = !{!"branch_weights", i32 101, i32 189} +; CHECK: [[PROF10]] = !{!"branch_weights", i32 67, i32 1} ;. _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits