[llvm] [LoopUnrollPass] Enable analysis of loops with `InlineAsm` (PR #179537)

Justin Fargnoli via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 3 11:49:28 PST 2026


https://github.com/justinfargnoli updated https://github.com/llvm/llvm-project/pull/179537

>From 9233d76619bb355064a6592599b0fdc0a64ba5f7 Mon Sep 17 00:00:00 2001
From: Justin Fargnoli <jfargnoli at nvidia.com>
Date: Tue, 3 Feb 2026 19:25:07 +0000
Subject: [PATCH 1/2] [LoopUnrollPass] Enable analysis of loops with inline asm

---
 llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp |  4 ++-
 .../LoopUnroll/analyze-cost-inline-asm.ll     | 35 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll

diff --git a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp
index 6050650eb937c..932e30d6a9cc2 100644
--- a/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp
@@ -39,6 +39,7 @@
 #include "llvm/IR/DiagnosticInfo.h"
 #include "llvm/IR/Dominators.h"
 #include "llvm/IR/Function.h"
+#include "llvm/IR/InlineAsm.h"
 #include "llvm/IR/Instruction.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/Metadata.h"
@@ -575,7 +576,8 @@ static std::optional<EstimatedUnrollCost> analyzeLoopUnrollCost(
         // FIXME: With a proper cost model we should be able to do it.
         if (auto *CI = dyn_cast<CallInst>(&I)) {
           const Function *Callee = CI->getCalledFunction();
-          if (!Callee || TTI.isLoweredToCall(Callee)) {
+          if (!isa<InlineAsm>(CI->getCalledOperand()) &&
+              (!Callee || TTI.isLoweredToCall(Callee))) {
             LLVM_DEBUG(dbgs() << "Can't analyze cost of loop with call\n");
             return std::nullopt;
           }
diff --git a/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll b/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll
new file mode 100644
index 0000000000000..1d9634dcd6ee2
--- /dev/null
+++ b/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=loop-unroll -S -unroll-threshold=20 < %s | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: define void @test() {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br label %[[LOOP:.*]]
+; CHECK:       [[LOOP]]:
+; CHECK-NEXT:    call void asm sideeffect "nop", ""()
+; CHECK-NEXT:    store i32 0, ptr null, align 4
+; CHECK-NEXT:    call void asm sideeffect "nop", ""()
+; CHECK-NEXT:    store i32 0, ptr null, align 4
+; CHECK-NEXT:    call void asm sideeffect "nop", ""()
+; CHECK-NEXT:    store i32 0, ptr null, align 4
+; CHECK-NEXT:    call void asm sideeffect "nop", ""()
+; CHECK-NEXT:    store i32 0, ptr null, align 4
+; CHECK-NEXT:    call void asm sideeffect "nop", ""()
+; CHECK-NEXT:    store i32 0, ptr null, align 4
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop
+
+loop:
+  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
+  call void asm sideeffect "nop", ""()
+  %c = icmp eq i32 0, 0
+  store i32 0, ptr null, align 4
+  %iv.next = add i32 %iv, 1
+  %cmp = icmp ult i32 %iv, 4
+  br i1 %cmp, label %loop, label %exit
+
+exit:
+  ret void
+}

>From 313bb303168354ed1d29b3023ef06f4c4c2de34c Mon Sep 17 00:00:00 2001
From: Justin Fargnoli <jfargnoli at nvidia.com>
Date: Tue, 3 Feb 2026 11:49:20 -0800
Subject: [PATCH 2/2] Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot at users.noreply.github.com>
---
 llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll b/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll
index 1d9634dcd6ee2..6bfce7659592a 100644
--- a/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll
+++ b/llvm/test/Transforms/LoopUnroll/analyze-cost-inline-asm.ll
@@ -24,7 +24,6 @@ entry:
 loop:
   %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
   call void asm sideeffect "nop", ""()
-  %c = icmp eq i32 0, 0
   store i32 0, ptr null, align 4
   %iv.next = add i32 %iv, 1
   %cmp = icmp ult i32 %iv, 4



More information about the llvm-commits mailing list