[PATCH] D108928: [X86ISelLowering] avoid emitting libcalls to __mulodi4()
Nick Desaulniers via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 30 10:56:31 PDT 2021
nickdesaulniers created this revision.
nickdesaulniers added reviewers: craig.topper, rengolin.
Herald added subscribers: pengfei, hiraditya.
nickdesaulniers requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Similar to D108842 <https://reviews.llvm.org/D108842>, D108844 <https://reviews.llvm.org/D108844>, and D108926 <https://reviews.llvm.org/D108926>.
__has_builtin(builtin_mul_overflow) returns true for 32b x86 targets,
but Clang is deferring to compiler RT when encountering long long types.
This ARCH=i386 + CONFIG_BLK_DEV_NBD=y builds of the Linux kernel that
are using builtin_mul_overflow with these types for these targets.
If the semantics of __has_builtin mean "the compiler resolves these,
always" then we shouldn't conditionally emit a libcall.
This will still need to be worked around in the Linux kernel in order to
continue to support these builds of the Linux kernel for this
target with older releases of clang.
Link: https://bugs.llvm.org/show_bug.cgi?id=28629
Link: https://github.com/ClangBuiltLinux/linux/issues/1438
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D108928
Files:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/overflow-intrinsic-optimizations.ll
Index: llvm/test/CodeGen/X86/overflow-intrinsic-optimizations.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/overflow-intrinsic-optimizations.ll
@@ -0,0 +1,19 @@
+; RUN: llc %s -mtriple=i386 -o - | FileCheck %s
+
+define i1 @no__mulodi4(i32 %a, i64 %b, i32* %c) {
+; CHECK-LABEL: no__mulodi4
+; CHECK-NOT: calll __mulodi4
+entry:
+ %0 = sext i32 %a to i64
+ %1 = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %0, i64 %b)
+ %2 = extractvalue { i64, i1 } %1, 1
+ %3 = extractvalue { i64, i1 } %1, 0
+ %4 = trunc i64 %3 to i32
+ %5 = sext i32 %4 to i64
+ %6 = icmp ne i64 %3, %5
+ %7 = or i1 %2, %6
+ store i32 %4, i32* %c, align 4
+ ret i1 %7
+}
+
+declare { i64, i1 } @llvm.smul.with.overflow.i64(i64, i64)
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2149,6 +2149,7 @@
setLibcallName(RTLIB::SRL_I128, nullptr);
setLibcallName(RTLIB::SRA_I128, nullptr);
setLibcallName(RTLIB::MUL_I128, nullptr);
+ setLibcallName(RTLIB::MULO_I64, nullptr);
setLibcallName(RTLIB::MULO_I128, nullptr);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108928.369492.patch
Type: text/x-patch
Size: 1252 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210830/15a649e7/attachment.bin>
More information about the llvm-commits
mailing list