Skip to content

Commit 222ab28

Browse files
[aarch64] Fix Arm64EC libcall lowering after recent refactoring. (#143977)
The refactored code accidentally tokenized a string instead of just concatenating it. Add a regression test and some assertions to ensure consistency. Fixes #143890 .
1 parent 7d9a451 commit 222ab28

File tree

4 files changed

+82
-28
lines changed

4 files changed

+82
-28
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,16 @@ HANDLE_LIBCALL(UREM_I16, "__umodhi3")
7070
HANDLE_LIBCALL(UREM_I32, "__umodsi3")
7171
HANDLE_LIBCALL(UREM_I64, "__umoddi3")
7272
HANDLE_LIBCALL(UREM_I128, "__umodti3")
73-
HANDLE_LIBCALL(SDIVREM_I8, nullptr)
74-
HANDLE_LIBCALL(SDIVREM_I16, nullptr)
75-
HANDLE_LIBCALL(SDIVREM_I32, nullptr)
76-
HANDLE_LIBCALL(SDIVREM_I64, nullptr)
77-
HANDLE_LIBCALL(SDIVREM_I128, nullptr)
78-
HANDLE_LIBCALL(UDIVREM_I8, nullptr)
79-
HANDLE_LIBCALL(UDIVREM_I16, nullptr)
80-
HANDLE_LIBCALL(UDIVREM_I32, nullptr)
81-
HANDLE_LIBCALL(UDIVREM_I64, nullptr)
82-
HANDLE_LIBCALL(UDIVREM_I128, nullptr)
73+
HANDLE_LIBCALL(SDIVREM_I8, LIBCALL_NO_NAME)
74+
HANDLE_LIBCALL(SDIVREM_I16, LIBCALL_NO_NAME)
75+
HANDLE_LIBCALL(SDIVREM_I32, LIBCALL_NO_NAME)
76+
HANDLE_LIBCALL(SDIVREM_I64, LIBCALL_NO_NAME)
77+
HANDLE_LIBCALL(SDIVREM_I128, LIBCALL_NO_NAME)
78+
HANDLE_LIBCALL(UDIVREM_I8, LIBCALL_NO_NAME)
79+
HANDLE_LIBCALL(UDIVREM_I16, LIBCALL_NO_NAME)
80+
HANDLE_LIBCALL(UDIVREM_I32, LIBCALL_NO_NAME)
81+
HANDLE_LIBCALL(UDIVREM_I64, LIBCALL_NO_NAME)
82+
HANDLE_LIBCALL(UDIVREM_I128, LIBCALL_NO_NAME)
8383
HANDLE_LIBCALL(NEG_I32, "__negsi2")
8484
HANDLE_LIBCALL(NEG_I64, "__negdi2")
8585
HANDLE_LIBCALL(CTLZ_I32, "__clzsi2")
@@ -240,13 +240,13 @@ HANDLE_LIBCALL(ATAN2_F64, "atan2")
240240
HANDLE_LIBCALL(ATAN2_F80, "atan2l")
241241
HANDLE_LIBCALL(ATAN2_F128,"atan2l")
242242
HANDLE_LIBCALL(ATAN2_PPCF128, "atan2l")
243-
HANDLE_LIBCALL(SINCOS_F32, nullptr)
244-
HANDLE_LIBCALL(SINCOS_F64, nullptr)
245-
HANDLE_LIBCALL(SINCOS_F80, nullptr)
246-
HANDLE_LIBCALL(SINCOS_F128, nullptr)
247-
HANDLE_LIBCALL(SINCOS_PPCF128, nullptr)
248-
HANDLE_LIBCALL(SINCOS_STRET_F32, nullptr)
249-
HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr)
243+
HANDLE_LIBCALL(SINCOS_F32, LIBCALL_NO_NAME)
244+
HANDLE_LIBCALL(SINCOS_F64, LIBCALL_NO_NAME)
245+
HANDLE_LIBCALL(SINCOS_F80, LIBCALL_NO_NAME)
246+
HANDLE_LIBCALL(SINCOS_F128, LIBCALL_NO_NAME)
247+
HANDLE_LIBCALL(SINCOS_PPCF128, LIBCALL_NO_NAME)
248+
HANDLE_LIBCALL(SINCOS_STRET_F32, LIBCALL_NO_NAME)
249+
HANDLE_LIBCALL(SINCOS_STRET_F64, LIBCALL_NO_NAME)
250250
HANDLE_LIBCALL(POW_F32, "powf")
251251
HANDLE_LIBCALL(POW_F64, "pow")
252252
HANDLE_LIBCALL(POW_F80, "powl")
@@ -518,7 +518,7 @@ HANDLE_LIBCALL(MEMMOVE, "memmove")
518518
HANDLE_LIBCALL(MEMSET, "memset")
519519
// DSEPass can emit calloc if it finds a pair of malloc/memset
520520
HANDLE_LIBCALL(CALLOC, "calloc")
521-
HANDLE_LIBCALL(BZERO, nullptr)
521+
HANDLE_LIBCALL(BZERO, LIBCALL_NO_NAME)
522522

523523
// Element-wise unordered-atomic memory of different sizes
524524
HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memcpy_element_unordered_atomic_1")
@@ -669,10 +669,10 @@ HANDLE_LIBCALL(ATOMIC_FETCH_NAND_16, "__atomic_fetch_nand_16")
669669

670670
// Out-of-line atomics libcalls
671671
#define HLCALLS(A, N) \
672-
HANDLE_LIBCALL(A##N##_RELAX, nullptr) \
673-
HANDLE_LIBCALL(A##N##_ACQ, nullptr) \
674-
HANDLE_LIBCALL(A##N##_REL, nullptr) \
675-
HANDLE_LIBCALL(A##N##_ACQ_REL, nullptr)
672+
HANDLE_LIBCALL(A##N##_RELAX, LIBCALL_NO_NAME) \
673+
HANDLE_LIBCALL(A##N##_ACQ, LIBCALL_NO_NAME) \
674+
HANDLE_LIBCALL(A##N##_REL, LIBCALL_NO_NAME) \
675+
HANDLE_LIBCALL(A##N##_ACQ_REL, LIBCALL_NO_NAME)
676676
#define HLCALL5(A) \
677677
HLCALLS(A, 1) HLCALLS(A, 2) HLCALLS(A, 4) HLCALLS(A, 8) HLCALLS(A, 16)
678678
HLCALL5(OUTLINE_ATOMIC_CAS)
@@ -691,11 +691,11 @@ HANDLE_LIBCALL(STACKPROTECTOR_CHECK_FAIL, "__stack_chk_fail")
691691
HANDLE_LIBCALL(DEOPTIMIZE, "__llvm_deoptimize")
692692

693693
// Return address
694-
HANDLE_LIBCALL(RETURN_ADDRESS, nullptr)
694+
HANDLE_LIBCALL(RETURN_ADDRESS, LIBCALL_NO_NAME)
695695

696696
// Clear cache
697697
HANDLE_LIBCALL(CLEAR_CACHE, "__clear_cache")
698698
HANDLE_LIBCALL(RISCV_FLUSH_ICACHE, "__riscv_flush_icache")
699699

700-
HANDLE_LIBCALL(UNKNOWN_LIBCALL, nullptr)
700+
HANDLE_LIBCALL(UNKNOWN_LIBCALL, LIBCALL_NO_NAME)
701701

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@ static void setAArch64LibcallNames(RuntimeLibcallsInfo &Info,
2121
if (TT.isWindowsArm64EC()) {
2222
// FIXME: are there calls we need to exclude from this?
2323
#define HANDLE_LIBCALL(code, name) \
24-
{ \
24+
if (sizeof(name) != 1) { \
2525
const char *libcallName = Info.getLibcallName(RTLIB::code); \
26-
if (libcallName && libcallName[0] != '#') \
27-
Info.setLibcallName(RTLIB::code, "#" #name); \
26+
if (libcallName && libcallName[0] != '#') { \
27+
assert(strcmp(libcallName, name) == 0 && "Unexpected name"); \
28+
Info.setLibcallName(RTLIB::code, "#" name); \
29+
} \
2830
}
31+
#define LIBCALL_NO_NAME ""
2932
#include "llvm/IR/RuntimeLibcalls.def"
3033
#undef HANDLE_LIBCALL
34+
#undef LIBCALL_NO_NAME
3135
}
3236
}
3337

@@ -223,8 +227,10 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
223227
nullptr);
224228

225229
#define HANDLE_LIBCALL(code, name) setLibcallName(RTLIB::code, name);
230+
#define LIBCALL_NO_NAME nullptr
226231
#include "llvm/IR/RuntimeLibcalls.def"
227232
#undef HANDLE_LIBCALL
233+
#undef LIBCALL_NO_NAME
228234

229235
// Initialize calling conventions to their default.
230236
for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC)
@@ -462,7 +468,8 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
462468
}
463469

464470
// Setup Windows compiler runtime calls.
465-
if (TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()) {
471+
if (TT.getArch() == Triple::x86 &&
472+
(TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment())) {
466473
static const struct {
467474
const RTLIB::Libcall Op;
468475
const char *const Name;

llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,8 +531,10 @@ struct StaticLibcallNameMap {
531531
StaticLibcallNameMap() {
532532
static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
533533
#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
534+
#define LIBCALL_NO_NAME nullptr
534535
#include "llvm/IR/RuntimeLibcalls.def"
535536
#undef HANDLE_LIBCALL
537+
#undef LIBCALL_NO_NAME
536538
};
537539
for (const auto &NameLibcall : NameLibcalls) {
538540
if (NameLibcall.first != nullptr &&
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; RUN: llc -mtriple=arm64ec-pc-windows-msvc < %s | FileCheck %s
2+
3+
define void @f1(ptr %p, i64 %n) {
4+
; CHECK-LABEL: "#f1":
5+
; CHECK: bl "#memset"
6+
call void @llvm.memset.p0.i64(ptr %p, i8 0, i64 %n, i1 false)
7+
ret void
8+
}
9+
10+
define void @f2(ptr %p1, ptr %p2, i64 %n) {
11+
; CHECK-LABEL: "#f2":
12+
; CHECK: bl "#memcpy"
13+
call void @llvm.memcpy.p0.i64(ptr %p1, ptr %p2, i64 %n, i1 false)
14+
ret void
15+
}
16+
17+
define double @f3(double %x, double %y) {
18+
; CHECK-LABEL: "#f3":
19+
; CHECK: b "#fmod"
20+
%r = frem double %x, %y
21+
ret double %r
22+
}
23+
24+
define i128 @f4(i128 %x, i128 %y) {
25+
; CHECK-LABEL: "#f4":
26+
; CHECK: bl "#__divti3"
27+
%r = sdiv i128 %x, %y
28+
ret i128 %r
29+
}
30+
31+
; FIXME: This is wrong; should be "#__aarch64_cas1_relax"
32+
define i8 @f5(i8 %expected, i8 %new, ptr %ptr) "target-features"="+outline-atomics" {
33+
; CHECK-LABEL: "#f5":
34+
; CHECK: bl __aarch64_cas1_relax
35+
%pair = cmpxchg ptr %ptr, i8 %expected, i8 %new monotonic monotonic, align 1
36+
%r = extractvalue { i8, i1 } %pair, 0
37+
ret i8 %r
38+
}
39+
40+
define float @f6(float %val, i32 %a) {
41+
; CHECK-LABEL: "#f6":
42+
; CHECK: bl "#ldexp"
43+
%call = tail call fast float @llvm.ldexp.f32(float %val, i32 %a)
44+
ret float %call
45+
}

0 commit comments

Comments
 (0)