[llvm] RuntimeLibcalls: Fix calling conv of win32 div libcalls (PR #149098)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 16 06:30:59 PDT 2025


https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/149098

There's probably an existing test this should be added to,
but our test coverage is really bad that this wasn't caught
by one.

>From 2087c26339c196088e12ba609a513083541bb39a Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 16 Jul 2025 22:13:17 +0900
Subject: [PATCH] RuntimeLibcalls: Fix calling conv of win32 div libcalls

There's probably an existing test this should be added to,
but our test coverage is really bad that this wasn't caught
by one.
---
 llvm/include/llvm/IR/RuntimeLibcalls.td       |  2 +-
 .../CodeGen/X86/win32-int-runtime-libcalls.ll | 72 +++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/CodeGen/X86/win32-int-runtime-libcalls.ll

diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index 11926d4128fcf..f0297cd1a0873 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -2129,7 +2129,7 @@ defvar X86CommonLibcalls =
 );
 
 defvar Windows32DivRemMulCalls =
-  LibcallImpls<(add WindowsDivRemMulLibcalls),
+  LibcallsWithCC<(add WindowsDivRemMulLibcalls), X86_STDCALL,
   RuntimeLibcallPredicate<"TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()">>;
 
 def X86_32SystemLibrary
diff --git a/llvm/test/CodeGen/X86/win32-int-runtime-libcalls.ll b/llvm/test/CodeGen/X86/win32-int-runtime-libcalls.ll
new file mode 100644
index 0000000000000..86f24ebf6ce86
--- /dev/null
+++ b/llvm/test/CodeGen/X86/win32-int-runtime-libcalls.ll
@@ -0,0 +1,72 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s
+
+define i64 @test_sdiv_i64(i64 %a, i64 %b) {
+; CHECK-LABEL: test_sdiv_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    calll __alldiv
+; CHECK-NEXT:    retl
+  %ret = sdiv i64 %a, %b
+  ret i64 %ret
+}
+
+define i64 @test_srem_i64(i64 %a, i64 %b) {
+; CHECK-LABEL: test_srem_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    calll __allrem
+; CHECK-NEXT:    retl
+  %ret = srem i64 %a, %b
+  ret i64 %ret
+}
+
+define i64 @test_udiv_i64(i64 %a, i64 %b) {
+; CHECK-LABEL: test_udiv_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    calll __aulldiv
+; CHECK-NEXT:    retl
+  %ret = udiv i64 %a, %b
+  ret i64 %ret
+}
+
+define i64 @test_urem_i64(i64 %a, i64 %b) {
+; CHECK-LABEL: test_urem_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-NEXT:    calll __aullrem
+; CHECK-NEXT:    retl
+  %ret = urem i64 %a, %b
+  ret i64 %ret
+}
+
+define i64 @test_mul_i64(i64 %a, i64 %b) {
+; CHECK-LABEL: test_mul_i64:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    pushl %esi
+; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi
+; CHECK-NEXT:    movl %ecx, %eax
+; CHECK-NEXT:    mull %esi
+; CHECK-NEXT:    imull {{[0-9]+}}(%esp), %ecx
+; CHECK-NEXT:    addl %ecx, %edx
+; CHECK-NEXT:    imull {{[0-9]+}}(%esp), %esi
+; CHECK-NEXT:    addl %esi, %edx
+; CHECK-NEXT:    popl %esi
+; CHECK-NEXT:    retl
+  %ret = mul i64 %a, %b
+  ret i64 %ret
+}



More information about the llvm-commits mailing list