The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
28.78k
stars
11.9k
forks
source link
[LoongArch] Suppress the unnecessary extensions for arguments in makeLibCall #92376
Closed
wangleiat closed 5 months ago
@llvm/pr-subscribers-backend-loongarch
Author: wanglei (wangleiat)
Changes
--- Full diff: https://github.com/llvm/llvm-project/pull/92376.diff 7 Files Affected: - (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+9) - (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.h (+1) - (modified) llvm/lib/Target/LoongArch/LoongArchSubtarget.h (+4) - (modified) llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll (+1-1) - (modified) llvm/test/CodeGen/LoongArch/libcall-extend.ll (+1-1) - (modified) llvm/test/CodeGen/LoongArch/sextw-removal.ll (+2-6) - (modified) llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll (-2) ``````````diff diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 6a0db9c27defe..fe2c613b1b30f 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -4991,3 +4991,12 @@ bool LoongArchTargetLowering::shouldSignExtendTypeInLibCall( return IsSigned; } + +bool LoongArchTargetLowering::shouldExtendTypeInLibCall(EVT Type) const { + // Return false to suppress the unnecessary extensions if the LibCall + // arguments or return value is a float narrower than GRLEN on a soft FP ABI. + if (Subtarget.isSoftFPABI() && (Type.isFloatingPoint() && !Type.isVector() && + Type.getSizeInBits() < Subtarget.getGRLen())) + return false; + return true; +} diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h index a344eadee8667..de3f45172e25a 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.h +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.h @@ -240,6 +240,7 @@ class LoongArchTargetLowering : public TargetLowering { } bool shouldConsiderGEPOffsetSplit() const override { return true; } bool shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned) const override; + bool shouldExtendTypeInLibCall(EVT Type) const override; private: /// Target-specific function used to lower LoongArch calling conventions. diff --git a/llvm/lib/Target/LoongArch/LoongArchSubtarget.h b/llvm/lib/Target/LoongArch/LoongArchSubtarget.h index bfdfdcf36d66e..b87ea6e2ec32b 100644 --- a/llvm/lib/Target/LoongArch/LoongArchSubtarget.h +++ b/llvm/lib/Target/LoongArch/LoongArchSubtarget.h @@ -91,6 +91,10 @@ class LoongArchSubtarget : public LoongArchGenSubtargetInfo { MVT getGRLenVT() const { return GRLenVT; } unsigned getGRLen() const { return GRLen; } LoongArchABI::ABI getTargetABI() const { return TargetABI; } + bool isSoftFPABI() const { + return TargetABI == LoongArchABI::ABI_LP64S || + TargetABI == LoongArchABI::ABI_ILP32S; + } bool isXRaySupported() const override { return is64Bit(); } Align getPrefFunctionAlignment() const { return PrefFunctionAlignment; } Align getPrefLoopAlignment() const { return PrefLoopAlignment; } diff --git a/llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll b/llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll index 184ba7363e1b3..8158c387f7b6b 100644 --- a/llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll +++ b/llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll @@ -10,7 +10,7 @@ define i64 @callee_float_in_regs(i64 %a, float %b) nounwind { ; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill ; CHECK-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill ; CHECK-NEXT: move $fp, $a0 -; CHECK-NEXT: addi.w $a0, $a1, 0 +; CHECK-NEXT: move $a0, $a1 ; CHECK-NEXT: bl %plt(__fixsfdi) ; CHECK-NEXT: add.d $a0, $fp, $a0 ; CHECK-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload diff --git a/llvm/test/CodeGen/LoongArch/libcall-extend.ll b/llvm/test/CodeGen/LoongArch/libcall-extend.ll index 3cc8a6645f368..7ca69811a7d57 100644 --- a/llvm/test/CodeGen/LoongArch/libcall-extend.ll +++ b/llvm/test/CodeGen/LoongArch/libcall-extend.ll @@ -6,7 +6,7 @@ define signext i32 @convert_float_to_i32(i32 %tmp, float %a) nounwind { ; CHECK: # %bb.0: ; CHECK-NEXT: addi.d $sp, $sp, -16 ; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; CHECK-NEXT: bstrpick.d $a0, $a1, 31, 0 +; CHECK-NEXT: move $a0, $a1 ; CHECK-NEXT: bl %plt(__fixsfsi) ; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload ; CHECK-NEXT: addi.d $sp, $sp, 16 diff --git a/llvm/test/CodeGen/LoongArch/sextw-removal.ll b/llvm/test/CodeGen/LoongArch/sextw-removal.ll index c9f3ed5237aa1..d95a5bd298f58 100644 --- a/llvm/test/CodeGen/LoongArch/sextw-removal.ll +++ b/llvm/test/CodeGen/LoongArch/sextw-removal.ll @@ -258,10 +258,9 @@ define void @test6(i32 signext %arg, i32 signext %arg1) nounwind { ; CHECK-NEXT: addi.w $a0, $fp, 0 ; CHECK-NEXT: bl %plt(baz) ; CHECK-NEXT: move $s0, $a0 -; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 0 ; CHECK-NEXT: bl %plt(__fixsfsi) ; CHECK-NEXT: move $fp, $a0 -; CHECK-NEXT: addi.w $a0, $s0, 0 +; CHECK-NEXT: move $a0, $s0 ; CHECK-NEXT: move $a1, $zero ; CHECK-NEXT: bl %plt(__nesf2) ; CHECK-NEXT: bnez $a0, .LBB5_1 @@ -285,10 +284,9 @@ define void @test6(i32 signext %arg, i32 signext %arg1) nounwind { ; NORMV-NEXT: addi.w $a0, $fp, 0 ; NORMV-NEXT: bl %plt(baz) ; NORMV-NEXT: move $s0, $a0 -; NORMV-NEXT: bstrpick.d $a0, $a0, 31, 0 ; NORMV-NEXT: bl %plt(__fixsfsi) ; NORMV-NEXT: move $fp, $a0 -; NORMV-NEXT: addi.w $a0, $s0, 0 +; NORMV-NEXT: move $a0, $s0 ; NORMV-NEXT: move $a1, $zero ; NORMV-NEXT: bl %plt(__nesf2) ; NORMV-NEXT: bnez $a0, .LBB5_1 @@ -562,7 +560,6 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind { ; CHECK-NEXT: addi.w $a0, $fp, 0 ; CHECK-NEXT: bl %plt(baz) ; CHECK-NEXT: move $fp, $a0 -; CHECK-NEXT: addi.w $a0, $a0, 0 ; CHECK-NEXT: move $a1, $zero ; CHECK-NEXT: bl %plt(__nesf2) ; CHECK-NEXT: bnez $a0, .LBB9_1 @@ -584,7 +581,6 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind { ; NORMV-NEXT: addi.w $a0, $fp, 0 ; NORMV-NEXT: bl %plt(baz) ; NORMV-NEXT: move $fp, $a0 -; NORMV-NEXT: addi.w $a0, $a0, 0 ; NORMV-NEXT: move $a1, $zero ; NORMV-NEXT: bl %plt(__nesf2) ; NORMV-NEXT: bnez $a0, .LBB9_1 diff --git a/llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll b/llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll index c23fc5a73ae0a..4eb34bfa09acb 100644 --- a/llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll +++ b/llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll @@ -69,7 +69,6 @@ define i32 @fptosi_i32_float(float %X) nounwind { ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0 ; LA64-NEXT: bl %plt(__fixsfsi) ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 16 @@ -145,7 +144,6 @@ define i64 @fptosi_i64_float(float %X) nounwind { ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; LA64-NEXT: addi.w $a0, $a0, 0 ; LA64-NEXT: bl %plt(__fixsfdi) ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 16 ``````````