Skip to content

Commit f21c2fa

Browse files
authored
[LoongArch] Set isReMaterializable on LU{12,32,52}I.D/ADDI.D and {X}ORI instructions (#94552)
1 parent 4a7b800 commit f21c2fa

File tree

2 files changed

+46
-40
lines changed

2 files changed

+46
-40
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,9 @@ def ADD_W : ALU_3R<0x00100000>;
734734
def SUB_W : ALU_3R<0x00110000>;
735735
def ADDI_W : ALU_2RI12<0x02800000, simm12_addlike>;
736736
def ALSL_W : ALU_3RI2<0x00040000, uimm2_plus1>;
737+
let isReMaterializable = 1 in {
737738
def LU12I_W : ALU_1RI20<0x14000000, simm20_lu12iw>;
739+
}
738740
def SLT : ALU_3R<0x00120000>;
739741
def SLTU : ALU_3R<0x00128000>;
740742
def SLTI : ALU_2RI12<0x02000000, simm12>;
@@ -749,8 +751,10 @@ def XOR : ALU_3R<0x00158000>;
749751
def ANDN : ALU_3R<0x00168000>;
750752
def ORN : ALU_3R<0x00160000>;
751753
def ANDI : ALU_2RI12<0x03400000, uimm12>;
754+
let isReMaterializable = 1 in {
752755
def ORI : ALU_2RI12<0x03800000, uimm12_ori>;
753756
def XORI : ALU_2RI12<0x03c00000, uimm12>;
757+
}
754758
def MUL_W : ALU_3R<0x001c0000>;
755759
def MULH_W : ALU_3R<0x001c8000>;
756760
def MULH_WU : ALU_3R<0x001d0000>;
@@ -852,17 +856,24 @@ let Predicates = [IsLA64] in {
852856
// Arithmetic Operation Instructions for 64-bits
853857
def ADD_D : ALU_3R<0x00108000>;
854858
def SUB_D : ALU_3R<0x00118000>;
859+
// ADDI_D isn't always rematerializable, but isReMaterializable will be used as
860+
// a hint which is verified in isReallyTriviallyReMaterializable.
861+
let isReMaterializable = 1 in {
855862
def ADDI_D : ALU_2RI12<0x02c00000, simm12_addlike>;
863+
}
856864
def ADDU16I_D : ALU_2RI16<0x10000000, simm16>;
857865
def ALSL_WU : ALU_3RI2<0x00060000, uimm2_plus1>;
858866
def ALSL_D : ALU_3RI2<0x002c0000, uimm2_plus1>;
859867
let Constraints = "$rd = $dst" in {
860-
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
868+
let hasSideEffects = 0, mayLoad = 0, mayStore = 0,
869+
isReMaterializable = 1 in
861870
def LU32I_D : Fmt1RI20<0x16000000, (outs GPR:$dst),
862871
(ins GPR:$rd, simm20_lu32id:$imm20),
863872
"$rd, $imm20">;
864873
}
874+
let isReMaterializable = 1 in {
865875
def LU52I_D : ALU_2RI12<0x03000000, simm12_lu52id>;
876+
}
866877
def PCADDU18I : ALU_1RI20<0x1e000000, simm20_pcaddu18i>;
867878
def MUL_D : ALU_3R<0x001d8000>;
868879
def MULH_D : ALU_3R<0x001e0000>;

llvm/test/CodeGen/LoongArch/vector-fp-imm.ll

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -742,12 +742,10 @@ define void @test_d8(ptr %P, ptr %S) nounwind {
742742
; LA32F-NEXT: st.w $a2, $sp, 32 # 4-byte Folded Spill
743743
; LA32F-NEXT: ld.w $a2, $a0, 52
744744
; LA32F-NEXT: st.w $a2, $sp, 28 # 4-byte Folded Spill
745-
; LA32F-NEXT: ld.w $a2, $a0, 40
746-
; LA32F-NEXT: st.w $a2, $sp, 16 # 4-byte Folded Spill
745+
; LA32F-NEXT: ld.w $s8, $a0, 40
747746
; LA32F-NEXT: ld.w $a2, $a0, 44
748-
; LA32F-NEXT: st.w $a2, $sp, 12 # 4-byte Folded Spill
749-
; LA32F-NEXT: ld.w $a2, $a0, 32
750-
; LA32F-NEXT: st.w $a2, $sp, 0 # 4-byte Folded Spill
747+
; LA32F-NEXT: st.w $a2, $sp, 16 # 4-byte Folded Spill
748+
; LA32F-NEXT: ld.w $s3, $a0, 32
751749
; LA32F-NEXT: ld.w $s4, $a0, 36
752750
; LA32F-NEXT: ld.w $s5, $a0, 24
753751
; LA32F-NEXT: ld.w $s6, $a0, 28
@@ -756,80 +754,77 @@ define void @test_d8(ptr %P, ptr %S) nounwind {
756754
; LA32F-NEXT: ld.w $s7, $a0, 8
757755
; LA32F-NEXT: ld.w $s0, $a0, 12
758756
; LA32F-NEXT: ld.w $a2, $a0, 0
759-
; LA32F-NEXT: ld.w $a3, $a0, 4
757+
; LA32F-NEXT: ld.w $a4, $a0, 4
760758
; LA32F-NEXT: move $fp, $a1
761-
; LA32F-NEXT: lu12i.w $s8, 261888
759+
; LA32F-NEXT: lu12i.w $a3, 261888
762760
; LA32F-NEXT: move $a0, $a2
763-
; LA32F-NEXT: move $a1, $a3
761+
; LA32F-NEXT: move $a1, $a4
764762
; LA32F-NEXT: move $a2, $zero
765-
; LA32F-NEXT: move $a3, $s8
766763
; LA32F-NEXT: bl %plt(__adddf3)
767764
; LA32F-NEXT: st.w $a0, $sp, 40 # 4-byte Folded Spill
768765
; LA32F-NEXT: st.w $a1, $sp, 36 # 4-byte Folded Spill
769-
; LA32F-NEXT: lu12i.w $s3, 262144
766+
; LA32F-NEXT: lu12i.w $a3, 262144
770767
; LA32F-NEXT: move $a0, $s7
771768
; LA32F-NEXT: move $a1, $s0
772769
; LA32F-NEXT: move $a2, $zero
773-
; LA32F-NEXT: move $a3, $s3
770+
; LA32F-NEXT: move $s0, $a3
774771
; LA32F-NEXT: bl %plt(__adddf3)
775772
; LA32F-NEXT: st.w $a0, $sp, 24 # 4-byte Folded Spill
776773
; LA32F-NEXT: st.w $a1, $sp, 20 # 4-byte Folded Spill
777-
; LA32F-NEXT: lu12i.w $s0, 262272
774+
; LA32F-NEXT: lu12i.w $s7, 262272
778775
; LA32F-NEXT: move $a0, $s1
779776
; LA32F-NEXT: move $a1, $s2
780777
; LA32F-NEXT: move $a2, $zero
781-
; LA32F-NEXT: move $a3, $s0
778+
; LA32F-NEXT: move $a3, $s7
782779
; LA32F-NEXT: bl %plt(__adddf3)
783-
; LA32F-NEXT: st.w $a0, $sp, 8 # 4-byte Folded Spill
784-
; LA32F-NEXT: st.w $a1, $sp, 4 # 4-byte Folded Spill
785-
; LA32F-NEXT: lu12i.w $s7, 262400
780+
; LA32F-NEXT: st.w $a0, $sp, 12 # 4-byte Folded Spill
781+
; LA32F-NEXT: move $s2, $a1
782+
; LA32F-NEXT: lu12i.w $a3, 262400
786783
; LA32F-NEXT: move $a0, $s5
787784
; LA32F-NEXT: move $a1, $s6
788785
; LA32F-NEXT: move $a2, $zero
789-
; LA32F-NEXT: move $a3, $s7
790786
; LA32F-NEXT: bl %plt(__adddf3)
791787
; LA32F-NEXT: move $s5, $a0
792788
; LA32F-NEXT: move $s6, $a1
793-
; LA32F-NEXT: ld.w $a0, $sp, 0 # 4-byte Folded Reload
789+
; LA32F-NEXT: move $a0, $s3
794790
; LA32F-NEXT: move $a1, $s4
795791
; LA32F-NEXT: move $a2, $zero
796-
; LA32F-NEXT: move $a3, $s8
792+
; LA32F-NEXT: lu12i.w $a3, 261888
797793
; LA32F-NEXT: bl %plt(__adddf3)
798-
; LA32F-NEXT: move $s4, $a0
799-
; LA32F-NEXT: move $s8, $a1
800-
; LA32F-NEXT: ld.w $a0, $sp, 16 # 4-byte Folded Reload
801-
; LA32F-NEXT: ld.w $a1, $sp, 12 # 4-byte Folded Reload
794+
; LA32F-NEXT: move $s3, $a0
795+
; LA32F-NEXT: move $s4, $a1
796+
; LA32F-NEXT: move $a0, $s8
797+
; LA32F-NEXT: ld.w $a1, $sp, 16 # 4-byte Folded Reload
802798
; LA32F-NEXT: move $a2, $zero
803-
; LA32F-NEXT: move $a3, $s3
799+
; LA32F-NEXT: move $a3, $s0
804800
; LA32F-NEXT: bl %plt(__adddf3)
805-
; LA32F-NEXT: move $s3, $a0
806-
; LA32F-NEXT: move $s1, $a1
801+
; LA32F-NEXT: move $s8, $a0
802+
; LA32F-NEXT: move $s0, $a1
807803
; LA32F-NEXT: ld.w $a0, $sp, 32 # 4-byte Folded Reload
808804
; LA32F-NEXT: ld.w $a1, $sp, 28 # 4-byte Folded Reload
809805
; LA32F-NEXT: move $a2, $zero
810-
; LA32F-NEXT: move $a3, $s0
806+
; LA32F-NEXT: move $a3, $s7
811807
; LA32F-NEXT: bl %plt(__adddf3)
812-
; LA32F-NEXT: move $s0, $a0
813-
; LA32F-NEXT: move $s2, $a1
808+
; LA32F-NEXT: move $s7, $a0
809+
; LA32F-NEXT: move $s1, $a1
814810
; LA32F-NEXT: ld.w $a0, $sp, 48 # 4-byte Folded Reload
815811
; LA32F-NEXT: ld.w $a1, $sp, 44 # 4-byte Folded Reload
816812
; LA32F-NEXT: move $a2, $zero
817-
; LA32F-NEXT: move $a3, $s7
813+
; LA32F-NEXT: lu12i.w $a3, 262400
818814
; LA32F-NEXT: bl %plt(__adddf3)
819815
; LA32F-NEXT: st.w $a0, $fp, 56
820816
; LA32F-NEXT: st.w $a1, $fp, 60
821-
; LA32F-NEXT: st.w $s0, $fp, 48
822-
; LA32F-NEXT: st.w $s2, $fp, 52
823-
; LA32F-NEXT: st.w $s3, $fp, 40
824-
; LA32F-NEXT: st.w $s1, $fp, 44
825-
; LA32F-NEXT: st.w $s4, $fp, 32
826-
; LA32F-NEXT: st.w $s8, $fp, 36
817+
; LA32F-NEXT: st.w $s7, $fp, 48
818+
; LA32F-NEXT: st.w $s1, $fp, 52
819+
; LA32F-NEXT: st.w $s8, $fp, 40
820+
; LA32F-NEXT: st.w $s0, $fp, 44
821+
; LA32F-NEXT: st.w $s3, $fp, 32
822+
; LA32F-NEXT: st.w $s4, $fp, 36
827823
; LA32F-NEXT: st.w $s5, $fp, 24
828824
; LA32F-NEXT: st.w $s6, $fp, 28
829-
; LA32F-NEXT: ld.w $a0, $sp, 8 # 4-byte Folded Reload
825+
; LA32F-NEXT: ld.w $a0, $sp, 12 # 4-byte Folded Reload
830826
; LA32F-NEXT: st.w $a0, $fp, 16
831-
; LA32F-NEXT: ld.w $a0, $sp, 4 # 4-byte Folded Reload
832-
; LA32F-NEXT: st.w $a0, $fp, 20
827+
; LA32F-NEXT: st.w $s2, $fp, 20
833828
; LA32F-NEXT: ld.w $a0, $sp, 24 # 4-byte Folded Reload
834829
; LA32F-NEXT: st.w $a0, $fp, 8
835830
; LA32F-NEXT: ld.w $a0, $sp, 20 # 4-byte Folded Reload

0 commit comments

Comments
 (0)