From 479fc752f5be405f9ad346e8310cfc55c5f4a5ef Mon Sep 17 00:00:00 2001 From: yangzhaoxin Date: Thu, 31 Oct 2024 18:08:21 +0800 Subject: [PATCH 1/3] [LoongArch] Support llvm.lround intrinsics with i32 return type. This is needed by flang, similar to RISCV-64 in D147195. --- .../LoongArch/LoongArchISelLowering.cpp | 13 ++++++++++++ llvm/test/CodeGen/LoongArch/double-lround.ll | 20 +++++++++++++++++++ llvm/test/CodeGen/LoongArch/float-lround.ll | 20 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 llvm/test/CodeGen/LoongArch/double-lround.ll create mode 100644 llvm/test/CodeGen/LoongArch/float-lround.ll diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 6bee00d1ce382..7bea9bdcfb8c1 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -143,6 +143,7 @@ LoongArchTargetLowering::LoongArchTargetLowering(const TargetMachine &TM, setOperationAction(ISD::BITREVERSE, MVT::i32, Custom); setOperationAction(ISD::BSWAP, MVT::i32, Custom); setOperationAction({ISD::UDIV, ISD::UREM}, MVT::i32, Custom); + setOperationAction(ISD::LROUND, MVT::i32, Custom); } // Set operations for LA32 only. @@ -3103,6 +3104,18 @@ void LoongArchTargetLowering::ReplaceNodeResults( replaceINTRINSIC_WO_CHAINResults(N, Results, DAG, Subtarget); break; } + case ISD::LROUND: { + SDValue Op0 = N->getOperand(0); + RTLIB::Libcall LC = + Op0.getValueType() == MVT::f64 ? RTLIB::LROUND_F64 : RTLIB::LROUND_F32; + MakeLibCallOptions CallOptions; + EVT OpVT = Op0.getValueType(); + CallOptions.setTypeListBeforeSoften(OpVT, MVT::i64, true); + SDValue Result = makeLibCall(DAG, LC, MVT::i64, Op0, CallOptions, DL).first; + Result = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Result); + Results.push_back(Result); + break; + } } } diff --git a/llvm/test/CodeGen/LoongArch/double-lround.ll b/llvm/test/CodeGen/LoongArch/double-lround.ll new file mode 100644 index 0000000000000..e90a7ce29e5a0 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/double-lround.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc --mtriple=loongarch64 --mattr=-f,-d %s -o - \ +; RUN: | FileCheck -check-prefix=LA64S %s + +declare i32 @llvm.lround.i32.f64(double) + +;; We support lround with i32 as return type on LoongArch64. This is needed by flang. +define i32 @lround_i32_f64(double %a) nounwind { +; LA64S-LABEL: lround_i32_f64: +; LA64S: # %bb.0: +; LA64S-NEXT: addi.d $sp, $sp, -16 +; LA64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64S-NEXT: bl %plt(lround) +; LA64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64S-NEXT: addi.d $sp, $sp, 16 +; LA64S-NEXT: ret + + %1 = call i32 @llvm.lround.i32.f64(double %a) + ret i32 %1 +} diff --git a/llvm/test/CodeGen/LoongArch/float-lround.ll b/llvm/test/CodeGen/LoongArch/float-lround.ll new file mode 100644 index 0000000000000..a17ba4e3e5d92 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/float-lround.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc --mtriple=loongarch64 --mattr=-f,-d %s -o - \ +; RUN: | FileCheck -check-prefix=LA64S %s + +declare i32 @llvm.lround.i32.f32(float) + +; We support lround with i32 as return type on LoongArch64. This is needed by flang. +define i32 @lround_i32_f32(float %a) nounwind { +; LA64S-LABEL: lround_i32_f32: +; LA64S: # %bb.0: +; LA64S-NEXT: addi.d $sp, $sp, -16 +; LA64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; LA64S-NEXT: bl %plt(lroundf) +; LA64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; LA64S-NEXT: addi.d $sp, $sp, 16 +; LA64S-NEXT: ret + + %1 = call i32 @llvm.lround.i32.f32(float %a) + ret i32 %1 +} From 86029e6432085084872f5fd6c101708fa4bb2238 Mon Sep 17 00:00:00 2001 From: yangzhaoxin Date: Mon, 4 Nov 2024 17:21:04 +0800 Subject: [PATCH 2/3] [LoongArch] Modify lround test. NFC --- .../LoongArch/LoongArchISelLowering.cpp | 4 ++-- llvm/test/CodeGen/LoongArch/double-lround.ll | 20 +++++++++---------- llvm/test/CodeGen/LoongArch/float-lround.ll | 20 +++++++++---------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 7bea9bdcfb8c1..9c21b8695b3cc 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -3106,10 +3106,10 @@ void LoongArchTargetLowering::ReplaceNodeResults( } case ISD::LROUND: { SDValue Op0 = N->getOperand(0); + EVT OpVT = Op0.getValueType(); RTLIB::Libcall LC = - Op0.getValueType() == MVT::f64 ? RTLIB::LROUND_F64 : RTLIB::LROUND_F32; + OpVT == MVT::f64 ? RTLIB::LROUND_F64 : RTLIB::LROUND_F32; MakeLibCallOptions CallOptions; - EVT OpVT = Op0.getValueType(); CallOptions.setTypeListBeforeSoften(OpVT, MVT::i64, true); SDValue Result = makeLibCall(DAG, LC, MVT::i64, Op0, CallOptions, DL).first; Result = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Result); diff --git a/llvm/test/CodeGen/LoongArch/double-lround.ll b/llvm/test/CodeGen/LoongArch/double-lround.ll index e90a7ce29e5a0..1b7791d683973 100644 --- a/llvm/test/CodeGen/LoongArch/double-lround.ll +++ b/llvm/test/CodeGen/LoongArch/double-lround.ll @@ -1,20 +1,18 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 -; RUN: llc --mtriple=loongarch64 --mattr=-f,-d %s -o - \ -; RUN: | FileCheck -check-prefix=LA64S %s +; RUN: llc --mtriple=loongarch64 %s -o - | FileCheck %s declare i32 @llvm.lround.i32.f64(double) ;; We support lround with i32 as return type on LoongArch64. This is needed by flang. define i32 @lround_i32_f64(double %a) nounwind { -; LA64S-LABEL: lround_i32_f64: -; LA64S: # %bb.0: -; LA64S-NEXT: addi.d $sp, $sp, -16 -; LA64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; LA64S-NEXT: bl %plt(lround) -; LA64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload -; LA64S-NEXT: addi.d $sp, $sp, 16 -; LA64S-NEXT: ret - +; CHECK-LABEL: lround_i32_f64: +; CHECK: # %bb.0: +; CHECK-NEXT: addi.d $sp, $sp, -16 +; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; CHECK-NEXT: bl %plt(lround) +; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; CHECK-NEXT: addi.d $sp, $sp, 16 +; CHECK-NEXT: ret %1 = call i32 @llvm.lround.i32.f64(double %a) ret i32 %1 } diff --git a/llvm/test/CodeGen/LoongArch/float-lround.ll b/llvm/test/CodeGen/LoongArch/float-lround.ll index a17ba4e3e5d92..337d522823a80 100644 --- a/llvm/test/CodeGen/LoongArch/float-lround.ll +++ b/llvm/test/CodeGen/LoongArch/float-lround.ll @@ -1,20 +1,18 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 -; RUN: llc --mtriple=loongarch64 --mattr=-f,-d %s -o - \ -; RUN: | FileCheck -check-prefix=LA64S %s +; RUN: llc --mtriple=loongarch64 %s -o - | FileCheck %s declare i32 @llvm.lround.i32.f32(float) ; We support lround with i32 as return type on LoongArch64. This is needed by flang. define i32 @lround_i32_f32(float %a) nounwind { -; LA64S-LABEL: lround_i32_f32: -; LA64S: # %bb.0: -; LA64S-NEXT: addi.d $sp, $sp, -16 -; LA64S-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; LA64S-NEXT: bl %plt(lroundf) -; LA64S-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload -; LA64S-NEXT: addi.d $sp, $sp, 16 -; LA64S-NEXT: ret - +; CHECK-LABEL: lround_i32_f32: +; CHECK: # %bb.0: +; CHECK-NEXT: addi.d $sp, $sp, -16 +; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill +; CHECK-NEXT: bl %plt(lroundf) +; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload +; CHECK-NEXT: addi.d $sp, $sp, 16 +; CHECK-NEXT: ret %1 = call i32 @llvm.lround.i32.f32(float %a) ret i32 %1 } From ba503a4eeb2caf92c6381e7c5685d1620775fcbd Mon Sep 17 00:00:00 2001 From: yangzhaoxin Date: Wed, 6 Nov 2024 13:55:25 +0800 Subject: [PATCH 3/3] [LoongArch] Modify the comment format. NFC --- llvm/test/CodeGen/LoongArch/float-lround.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/CodeGen/LoongArch/float-lround.ll b/llvm/test/CodeGen/LoongArch/float-lround.ll index 337d522823a80..a129aa27a3e3e 100644 --- a/llvm/test/CodeGen/LoongArch/float-lround.ll +++ b/llvm/test/CodeGen/LoongArch/float-lround.ll @@ -3,7 +3,7 @@ declare i32 @llvm.lround.i32.f32(float) -; We support lround with i32 as return type on LoongArch64. This is needed by flang. +;; We support lround with i32 as return type on LoongArch64. This is needed by flang. define i32 @lround_i32_f32(float %a) nounwind { ; CHECK-LABEL: lround_i32_f32: ; CHECK: # %bb.0: