Skip to content

Commit 4b70294

Browse files
authored
[LoongArch] Add a hook to sign extend i32 ConstantInt operands of phis on LA64 (#93813)
Materializing constants on LoongArch is simpler if the constant is sign extended from i32. By default i32 constant operands of phis are zero extended. This patch adds a hook to allow LoongArch to override this for i32. We have an existing isSExtCheaperThanZExt, but it operates on EVT which we don't have at these places in the code.
1 parent fb8ea85 commit 4b70294

File tree

3 files changed

+15
-22
lines changed

3 files changed

+15
-22
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5004,6 +5004,10 @@ bool LoongArchTargetLowering::isSExtCheaperThanZExt(EVT SrcVT,
50045004
return Subtarget.is64Bit() && SrcVT == MVT::i32 && DstVT == MVT::i64;
50055005
}
50065006

5007+
bool LoongArchTargetLowering::signExtendConstant(const ConstantInt *CI) const {
5008+
return Subtarget.is64Bit() && CI->getType()->isIntegerTy(32);
5009+
}
5010+
50075011
bool LoongArchTargetLowering::hasAndNotCompare(SDValue Y) const {
50085012
// TODO: Support vectors.
50095013
if (Y.getValueType().isVector())

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ class LoongArchTargetLowering : public TargetLowering {
229229
bool isLegalAddImmediate(int64_t Imm) const override;
230230
bool isZExtFree(SDValue Val, EVT VT2) const override;
231231
bool isSExtCheaperThanZExt(EVT SrcVT, EVT DstVT) const override;
232+
bool signExtendConstant(const ConstantInt *CI) const override;
232233

233234
bool hasAndNotCompare(SDValue Y) const override;
234235

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

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -762,7 +762,6 @@ define signext i32 @test14(i32 signext %0, i32 signext %1) {
762762
; CHECK-NEXT: # %bb.1: # %.preheader
763763
; CHECK-NEXT: ori $a3, $zero, 1
764764
; CHECK-NEXT: addi.w $a2, $zero, -1
765-
; CHECK-NEXT: lu32i.d $a2, 0
766765
; CHECK-NEXT: ori $a4, $zero, 1000
767766
; CHECK-NEXT: .p2align 4, , 16
768767
; CHECK-NEXT: .LBB13_2: # =>This Inner Loop Header: Depth=1
@@ -772,10 +771,9 @@ define signext i32 @test14(i32 signext %0, i32 signext %1) {
772771
; CHECK-NEXT: addi.w $a3, $a3, 1
773772
; CHECK-NEXT: blt $a3, $a1, .LBB13_2
774773
; CHECK-NEXT: .LBB13_4:
775-
; CHECK-NEXT: addi.w $a0, $a0, 0
776774
; CHECK-NEXT: ret
777775
; CHECK-NEXT: .LBB13_5:
778-
; CHECK-NEXT: addi.w $a0, $a2, 0
776+
; CHECK-NEXT: move $a0, $a2
779777
; CHECK-NEXT: ret
780778
;
781779
; NORMV-LABEL: test14:
@@ -785,7 +783,6 @@ define signext i32 @test14(i32 signext %0, i32 signext %1) {
785783
; NORMV-NEXT: # %bb.1: # %.preheader
786784
; NORMV-NEXT: ori $a3, $zero, 1
787785
; NORMV-NEXT: addi.w $a2, $zero, -1
788-
; NORMV-NEXT: lu32i.d $a2, 0
789786
; NORMV-NEXT: ori $a4, $zero, 1000
790787
; NORMV-NEXT: .p2align 4, , 16
791788
; NORMV-NEXT: .LBB13_2: # =>This Inner Loop Header: Depth=1
@@ -795,13 +792,12 @@ define signext i32 @test14(i32 signext %0, i32 signext %1) {
795792
; NORMV-NEXT: add.d $a0, $a3, $a0
796793
; NORMV-NEXT: addi.d $a3, $a3, 1
797794
; NORMV-NEXT: addi.w $a3, $a3, 0
798-
; NORMV-NEXT: addi.d $a0, $a0, 0
795+
; NORMV-NEXT: addi.w $a0, $a0, 0
799796
; NORMV-NEXT: blt $a3, $a1, .LBB13_2
800797
; NORMV-NEXT: .LBB13_4:
801-
; NORMV-NEXT: addi.w $a0, $a0, 0
802798
; NORMV-NEXT: ret
803799
; NORMV-NEXT: .LBB13_5:
804-
; NORMV-NEXT: addi.w $a0, $a2, 0
800+
; NORMV-NEXT: move $a0, $a2
805801
; NORMV-NEXT: ret
806802
%3 = icmp sgt i32 %1, 1
807803
br i1 %3, label %4, label %12
@@ -830,8 +826,7 @@ define signext i32 @test14b(i32 %0, i32 signext %1) {
830826
; CHECK-NEXT: blt $a1, $a2, .LBB14_4
831827
; CHECK-NEXT: # %bb.1: # %.preheader
832828
; CHECK-NEXT: ori $a3, $zero, 1
833-
; CHECK-NEXT: addi.w $a2, $zero, -1
834-
; CHECK-NEXT: lu32i.d $a2, 0
829+
; CHECK-NEXT: addi.d $a2, $zero, -1
835830
; CHECK-NEXT: ori $a4, $zero, 1000
836831
; CHECK-NEXT: .p2align 4, , 16
837832
; CHECK-NEXT: .LBB14_2: # =>This Inner Loop Header: Depth=1
@@ -854,8 +849,7 @@ define signext i32 @test14b(i32 %0, i32 signext %1) {
854849
; NORMV-NEXT: blt $a1, $a2, .LBB14_4
855850
; NORMV-NEXT: # %bb.1: # %.preheader
856851
; NORMV-NEXT: ori $a3, $zero, 1
857-
; NORMV-NEXT: addi.w $a2, $zero, -1
858-
; NORMV-NEXT: lu32i.d $a2, 0
852+
; NORMV-NEXT: addi.d $a2, $zero, -1
859853
; NORMV-NEXT: ori $a4, $zero, 1000
860854
; NORMV-NEXT: .p2align 4, , 16
861855
; NORMV-NEXT: .LBB14_2: # =>This Inner Loop Header: Depth=1
@@ -900,8 +894,7 @@ define signext i32 @test14c(i32 zeroext %0, i32 signext %1) {
900894
; CHECK-NEXT: blt $a1, $a2, .LBB15_4
901895
; CHECK-NEXT: # %bb.1: # %.preheader
902896
; CHECK-NEXT: ori $a3, $zero, 1
903-
; CHECK-NEXT: addi.w $a2, $zero, -1
904-
; CHECK-NEXT: lu32i.d $a2, 0
897+
; CHECK-NEXT: addi.d $a2, $zero, -1
905898
; CHECK-NEXT: ori $a4, $zero, 1000
906899
; CHECK-NEXT: .p2align 4, , 16
907900
; CHECK-NEXT: .LBB15_2: # =>This Inner Loop Header: Depth=1
@@ -924,8 +917,7 @@ define signext i32 @test14c(i32 zeroext %0, i32 signext %1) {
924917
; NORMV-NEXT: blt $a1, $a2, .LBB15_4
925918
; NORMV-NEXT: # %bb.1: # %.preheader
926919
; NORMV-NEXT: ori $a3, $zero, 1
927-
; NORMV-NEXT: addi.w $a2, $zero, -1
928-
; NORMV-NEXT: lu32i.d $a2, 0
920+
; NORMV-NEXT: addi.d $a2, $zero, -1
929921
; NORMV-NEXT: ori $a4, $zero, 1000
930922
; NORMV-NEXT: .p2align 4, , 16
931923
; NORMV-NEXT: .LBB15_2: # =>This Inner Loop Header: Depth=1
@@ -971,7 +963,6 @@ define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {
971963
; CHECK-NEXT: # %bb.1: # %.preheader
972964
; CHECK-NEXT: ori $a3, $zero, 1
973965
; CHECK-NEXT: addi.w $a2, $zero, -1
974-
; CHECK-NEXT: lu32i.d $a2, 0
975966
; CHECK-NEXT: ori $a4, $zero, 1000
976967
; CHECK-NEXT: .p2align 4, , 16
977968
; CHECK-NEXT: .LBB16_2: # =>This Inner Loop Header: Depth=1
@@ -981,10 +972,9 @@ define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {
981972
; CHECK-NEXT: addi.w $a3, $a3, 1
982973
; CHECK-NEXT: blt $a3, $a1, .LBB16_2
983974
; CHECK-NEXT: .LBB16_4:
984-
; CHECK-NEXT: addi.w $a0, $a0, 0
985975
; CHECK-NEXT: ret
986976
; CHECK-NEXT: .LBB16_5:
987-
; CHECK-NEXT: addi.w $a0, $a2, 0
977+
; CHECK-NEXT: move $a0, $a2
988978
; CHECK-NEXT: ret
989979
;
990980
; NORMV-LABEL: test14d:
@@ -994,7 +984,6 @@ define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {
994984
; NORMV-NEXT: # %bb.1: # %.preheader
995985
; NORMV-NEXT: ori $a3, $zero, 1
996986
; NORMV-NEXT: addi.w $a2, $zero, -1
997-
; NORMV-NEXT: lu32i.d $a2, 0
998987
; NORMV-NEXT: ori $a4, $zero, 1000
999988
; NORMV-NEXT: .p2align 4, , 16
1000989
; NORMV-NEXT: .LBB16_2: # =>This Inner Loop Header: Depth=1
@@ -1004,13 +993,12 @@ define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {
1004993
; NORMV-NEXT: add.d $a0, $a3, $a0
1005994
; NORMV-NEXT: addi.d $a3, $a3, 1
1006995
; NORMV-NEXT: addi.w $a3, $a3, 0
1007-
; NORMV-NEXT: addi.d $a0, $a0, 0
996+
; NORMV-NEXT: addi.w $a0, $a0, 0
1008997
; NORMV-NEXT: blt $a3, $a1, .LBB16_2
1009998
; NORMV-NEXT: .LBB16_4:
1010-
; NORMV-NEXT: addi.w $a0, $a0, 0
1011999
; NORMV-NEXT: ret
10121000
; NORMV-NEXT: .LBB16_5:
1013-
; NORMV-NEXT: addi.w $a0, $a2, 0
1001+
; NORMV-NEXT: move $a0, $a2
10141002
; NORMV-NEXT: ret
10151003
%zext = zext i31 %0 to i32
10161004
%3 = icmp sgt i32 %1, 1

0 commit comments

Comments
 (0)