@@ -871,3 +871,87 @@ define void @zext_nneg_dominating_icmp_i32_zeroext(i16 signext %0) {
871
871
5 :
872
872
ret void
873
873
}
874
+
875
+ ; The load is used extended and non-extended in the successor basic block. The
876
+ ; signed compare will cause the non-extended value to exported out of the first
877
+ ; basic block using a sext to XLen. We need to CSE the zext nneg with the sext
878
+ ; so that we can form a sextload.
879
+ define void @load_zext_nneg_sext_cse (ptr %p ) nounwind {
880
+ ; RV32I-LABEL: load_zext_nneg_sext_cse:
881
+ ; RV32I: # %bb.0:
882
+ ; RV32I-NEXT: addi sp, sp, -16
883
+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
884
+ ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
885
+ ; RV32I-NEXT: lhu s0, 0(a0)
886
+ ; RV32I-NEXT: slli a0, s0, 16
887
+ ; RV32I-NEXT: bltz a0, .LBB50_2
888
+ ; RV32I-NEXT: # %bb.1: # %bb1
889
+ ; RV32I-NEXT: srai a0, a0, 16
890
+ ; RV32I-NEXT: call bar_i16
891
+ ; RV32I-NEXT: mv a0, s0
892
+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
893
+ ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
894
+ ; RV32I-NEXT: addi sp, sp, 16
895
+ ; RV32I-NEXT: tail bar_i32
896
+ ; RV32I-NEXT: .LBB50_2: # %bb2
897
+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
898
+ ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
899
+ ; RV32I-NEXT: addi sp, sp, 16
900
+ ; RV32I-NEXT: ret
901
+ ;
902
+ ; RV64I-LABEL: load_zext_nneg_sext_cse:
903
+ ; RV64I: # %bb.0:
904
+ ; RV64I-NEXT: addi sp, sp, -16
905
+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
906
+ ; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
907
+ ; RV64I-NEXT: lhu s0, 0(a0)
908
+ ; RV64I-NEXT: slli a0, s0, 48
909
+ ; RV64I-NEXT: bltz a0, .LBB50_2
910
+ ; RV64I-NEXT: # %bb.1: # %bb1
911
+ ; RV64I-NEXT: srai a0, a0, 48
912
+ ; RV64I-NEXT: call bar_i16
913
+ ; RV64I-NEXT: mv a0, s0
914
+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
915
+ ; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
916
+ ; RV64I-NEXT: addi sp, sp, 16
917
+ ; RV64I-NEXT: tail bar_i32
918
+ ; RV64I-NEXT: .LBB50_2: # %bb2
919
+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
920
+ ; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
921
+ ; RV64I-NEXT: addi sp, sp, 16
922
+ ; RV64I-NEXT: ret
923
+ ;
924
+ ; RV64ZBB-LABEL: load_zext_nneg_sext_cse:
925
+ ; RV64ZBB: # %bb.0:
926
+ ; RV64ZBB-NEXT: addi sp, sp, -16
927
+ ; RV64ZBB-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
928
+ ; RV64ZBB-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
929
+ ; RV64ZBB-NEXT: lhu s0, 0(a0)
930
+ ; RV64ZBB-NEXT: sext.h a0, s0
931
+ ; RV64ZBB-NEXT: bltz a0, .LBB50_2
932
+ ; RV64ZBB-NEXT: # %bb.1: # %bb1
933
+ ; RV64ZBB-NEXT: call bar_i16
934
+ ; RV64ZBB-NEXT: mv a0, s0
935
+ ; RV64ZBB-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
936
+ ; RV64ZBB-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
937
+ ; RV64ZBB-NEXT: addi sp, sp, 16
938
+ ; RV64ZBB-NEXT: tail bar_i32
939
+ ; RV64ZBB-NEXT: .LBB50_2: # %bb2
940
+ ; RV64ZBB-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
941
+ ; RV64ZBB-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
942
+ ; RV64ZBB-NEXT: addi sp, sp, 16
943
+ ; RV64ZBB-NEXT: ret
944
+ %load = load i16 , ptr %p
945
+ %zext = zext nneg i16 %load to i32
946
+ %cmp = icmp sgt i16 %load , -1
947
+ br i1 %cmp , label %bb1 , label %bb2
948
+
949
+ bb1:
950
+ tail call void @bar_i16 (i16 signext %load )
951
+ tail call void @bar_i32 (i32 signext %zext )
952
+ br label %bb2
953
+
954
+ bb2:
955
+ ret void
956
+ }
957
+ declare void @bar_i16 (i16 );
0 commit comments