[PATCH] D155632: Preserve important metadata in JumpThreadingPass::unfoldSelectInstr

Mark Mendell via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 18 13:03:00 PDT 2023


mmendell created this revision.
mmendell added a reviewer: nikic.
Herald added subscribers: StephenFan, hiraditya.
Herald added a project: All.
mmendell requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Useful metadata like llvm.loop can be lost when the new branch instruction is created. Grab that metadata from the old branch.
Add a **correct **LIT test to check


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D155632

Files:
  llvm/lib/Transforms/Scalar/JumpThreading.cpp
  llvm/test/Transforms/JumpThreading/preserve-select-unfold.ll


Index: llvm/test/Transforms/JumpThreading/preserve-select-unfold.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/JumpThreading/preserve-select-unfold.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
+; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
+; Ensure that we preserve llvm.loop information
+define spir_kernel void @test(i1 %Input) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[A:%.*]]
+; CHECK:       select.unfold:
+; CHECK-NEXT:    br label [[A]], !llvm.loop [[LOOP0:![0-9]+]]
+; CHECK:       A:
+; CHECK-NEXT:    [[CURRENT_STATE_0_I_I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 0, [[M:%.*]] ], [ 2, [[SELECT_UNFOLD:%.*]] ]
+; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[CURRENT_STATE_0_I_I]], 0
+; CHECK-NEXT:    br i1 [[B]], label [[M]], label [[B2:%.*]]
+; CHECK:       B2:
+; CHECK-NEXT:    ret void
+; CHECK:       M:
+; CHECK-NEXT:    br i1 [[INPUT:%.*]], label [[SELECT_UNFOLD]], label [[A]], !llvm.loop [[LOOP0]]
+;
+entry:
+  br label %A
+
+A:
+  %current_state.0.i.i = phi i32 [ 0, %entry ], [ %X, %M ]
+  %B = icmp eq i32 %current_state.0.i.i, 0
+  br i1 %B, label %M, label %B2
+
+B2:
+  ret void
+
+M:
+  %X = select i1 %Input, i32 2, i32 0
+  br label %A, !llvm.loop !0
+}
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.unroll.disable"}
+;.
+; CHECK: [[LOOP0]] = distinct !{!0, !1}
+; CHECK: [[META1:![0-9]+]] = !{!"llvm.loop.unroll.disable"}
+;.
Index: llvm/lib/Transforms/Scalar/JumpThreading.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -2728,6 +2728,9 @@
   auto *BI = BranchInst::Create(NewBB, BB, SI->getCondition(), Pred);
   BI->applyMergedLocation(PredTerm->getDebugLoc(), SI->getDebugLoc());
   BI->copyMetadata(*SI, {LLVMContext::MD_prof});
+  // Also preserve the metadata from the branch
+  BI->copyMetadata(*PredTerm,
+                   {LLVMContext::MD_loop, LLVMContext::MD_annotation});
   SIUse->setIncomingValue(Idx, SI->getFalseValue());
   SIUse->addIncoming(SI->getTrueValue(), NewBB);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155632.541686.patch
Type: text/x-patch
Size: 2231 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230718/2e4b0aee/attachment.bin>


More information about the llvm-commits mailing list