[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