Skip to content

Commit bf1d417

Browse files
authored
[LoongArch] Suppress the unnecessary extensions for arguments in makeLibCall
Reviewed By: SixWeining, heiher Pull Request: #92376
1 parent 5a204a5 commit bf1d417

File tree

7 files changed

+18
-10
lines changed

7 files changed

+18
-10
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4991,3 +4991,12 @@ bool LoongArchTargetLowering::shouldSignExtendTypeInLibCall(
49914991

49924992
return IsSigned;
49934993
}
4994+
4995+
bool LoongArchTargetLowering::shouldExtendTypeInLibCall(EVT Type) const {
4996+
// Return false to suppress the unnecessary extensions if the LibCall
4997+
// arguments or return value is a float narrower than GRLEN on a soft FP ABI.
4998+
if (Subtarget.isSoftFPABI() && (Type.isFloatingPoint() && !Type.isVector() &&
4999+
Type.getSizeInBits() < Subtarget.getGRLen()))
5000+
return false;
5001+
return true;
5002+
}

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ class LoongArchTargetLowering : public TargetLowering {
240240
}
241241
bool shouldConsiderGEPOffsetSplit() const override { return true; }
242242
bool shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned) const override;
243+
bool shouldExtendTypeInLibCall(EVT Type) const override;
243244

244245
private:
245246
/// Target-specific function used to lower LoongArch calling conventions.

llvm/lib/Target/LoongArch/LoongArchSubtarget.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ class LoongArchSubtarget : public LoongArchGenSubtargetInfo {
9191
MVT getGRLenVT() const { return GRLenVT; }
9292
unsigned getGRLen() const { return GRLen; }
9393
LoongArchABI::ABI getTargetABI() const { return TargetABI; }
94+
bool isSoftFPABI() const {
95+
return TargetABI == LoongArchABI::ABI_LP64S ||
96+
TargetABI == LoongArchABI::ABI_ILP32S;
97+
}
9498
bool isXRaySupported() const override { return is64Bit(); }
9599
Align getPrefFunctionAlignment() const { return PrefFunctionAlignment; }
96100
Align getPrefLoopAlignment() const { return PrefLoopAlignment; }

llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ define i64 @callee_float_in_regs(i64 %a, float %b) nounwind {
1010
; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
1111
; CHECK-NEXT: st.d $fp, $sp, 0 # 8-byte Folded Spill
1212
; CHECK-NEXT: move $fp, $a0
13-
; CHECK-NEXT: addi.w $a0, $a1, 0
13+
; CHECK-NEXT: move $a0, $a1
1414
; CHECK-NEXT: bl %plt(__fixsfdi)
1515
; CHECK-NEXT: add.d $a0, $fp, $a0
1616
; CHECK-NEXT: ld.d $fp, $sp, 0 # 8-byte Folded Reload

llvm/test/CodeGen/LoongArch/libcall-extend.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ define signext i32 @convert_float_to_i32(i32 %tmp, float %a) nounwind {
66
; CHECK: # %bb.0:
77
; CHECK-NEXT: addi.d $sp, $sp, -16
88
; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
9-
; CHECK-NEXT: bstrpick.d $a0, $a1, 31, 0
9+
; CHECK-NEXT: move $a0, $a1
1010
; CHECK-NEXT: bl %plt(__fixsfsi)
1111
; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
1212
; CHECK-NEXT: addi.d $sp, $sp, 16

llvm/test/CodeGen/LoongArch/sextw-removal.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,9 @@ define void @test6(i32 signext %arg, i32 signext %arg1) nounwind {
258258
; CHECK-NEXT: addi.w $a0, $fp, 0
259259
; CHECK-NEXT: bl %plt(baz)
260260
; CHECK-NEXT: move $s0, $a0
261-
; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 0
262261
; CHECK-NEXT: bl %plt(__fixsfsi)
263262
; CHECK-NEXT: move $fp, $a0
264-
; CHECK-NEXT: addi.w $a0, $s0, 0
263+
; CHECK-NEXT: move $a0, $s0
265264
; CHECK-NEXT: move $a1, $zero
266265
; CHECK-NEXT: bl %plt(__nesf2)
267266
; CHECK-NEXT: bnez $a0, .LBB5_1
@@ -285,10 +284,9 @@ define void @test6(i32 signext %arg, i32 signext %arg1) nounwind {
285284
; NORMV-NEXT: addi.w $a0, $fp, 0
286285
; NORMV-NEXT: bl %plt(baz)
287286
; NORMV-NEXT: move $s0, $a0
288-
; NORMV-NEXT: bstrpick.d $a0, $a0, 31, 0
289287
; NORMV-NEXT: bl %plt(__fixsfsi)
290288
; NORMV-NEXT: move $fp, $a0
291-
; NORMV-NEXT: addi.w $a0, $s0, 0
289+
; NORMV-NEXT: move $a0, $s0
292290
; NORMV-NEXT: move $a1, $zero
293291
; NORMV-NEXT: bl %plt(__nesf2)
294292
; NORMV-NEXT: bnez $a0, .LBB5_1
@@ -562,7 +560,6 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {
562560
; CHECK-NEXT: addi.w $a0, $fp, 0
563561
; CHECK-NEXT: bl %plt(baz)
564562
; CHECK-NEXT: move $fp, $a0
565-
; CHECK-NEXT: addi.w $a0, $a0, 0
566563
; CHECK-NEXT: move $a1, $zero
567564
; CHECK-NEXT: bl %plt(__nesf2)
568565
; CHECK-NEXT: bnez $a0, .LBB9_1
@@ -584,7 +581,6 @@ define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {
584581
; NORMV-NEXT: addi.w $a0, $fp, 0
585582
; NORMV-NEXT: bl %plt(baz)
586583
; NORMV-NEXT: move $fp, $a0
587-
; NORMV-NEXT: addi.w $a0, $a0, 0
588584
; NORMV-NEXT: move $a1, $zero
589585
; NORMV-NEXT: bl %plt(__nesf2)
590586
; NORMV-NEXT: bnez $a0, .LBB9_1

llvm/test/CodeGen/LoongArch/soft-fp-to-int.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ define i32 @fptosi_i32_float(float %X) nounwind {
6969
; LA64: # %bb.0:
7070
; LA64-NEXT: addi.d $sp, $sp, -16
7171
; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
72-
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
7372
; LA64-NEXT: bl %plt(__fixsfsi)
7473
; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
7574
; LA64-NEXT: addi.d $sp, $sp, 16
@@ -145,7 +144,6 @@ define i64 @fptosi_i64_float(float %X) nounwind {
145144
; LA64: # %bb.0:
146145
; LA64-NEXT: addi.d $sp, $sp, -16
147146
; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
148-
; LA64-NEXT: addi.w $a0, $a0, 0
149147
; LA64-NEXT: bl %plt(__fixsfdi)
150148
; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
151149
; LA64-NEXT: addi.d $sp, $sp, 16

0 commit comments

Comments
 (0)