Skip to content

Commit 999591a

Browse files
committed
[LoongArch] Add a hook to sign extend i32 ConstantInt operands of phis on LA64.
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 718331f commit 999591a

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)