Skip to content

Commit b1849a2

Browse files
committed
[RISCV] Add test cases for missed opportunites to treat a zext nneg as sext. NFC
These tests have a dominating icmp that require an i16 value to be sign extended to do the compare. Because of this, the i16 will be exported from the first basic block sign extended to XLen. We can use this fact to remove the zext nneg in the scond block.
1 parent 9466c4e commit b1849a2

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

llvm/test/CodeGen/RISCV/sext-zext-trunc.ll

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,3 +750,90 @@ define i64 @dec_of_zexted_cmp_i64(i64 %x) {
750750
%dec = sub i64 %zext, 1
751751
ret i64 %dec
752752
}
753+
754+
define void @zext_nneg_dominating_icmp_i64(i16 signext %0) {
755+
; RV32I-LABEL: zext_nneg_dominating_icmp_i64:
756+
; RV32I: # %bb.0:
757+
; RV32I-NEXT: bltz a0, .LBB46_2
758+
; RV32I-NEXT: # %bb.1:
759+
; RV32I-NEXT: slli a0, a0, 16
760+
; RV32I-NEXT: srli a0, a0, 16
761+
; RV32I-NEXT: li a1, 0
762+
; RV32I-NEXT: tail bar_i64
763+
; RV32I-NEXT: .LBB46_2:
764+
; RV32I-NEXT: ret
765+
;
766+
; RV64I-LABEL: zext_nneg_dominating_icmp_i64:
767+
; RV64I: # %bb.0:
768+
; RV64I-NEXT: bltz a0, .LBB46_2
769+
; RV64I-NEXT: # %bb.1:
770+
; RV64I-NEXT: slli a0, a0, 48
771+
; RV64I-NEXT: srli a0, a0, 48
772+
; RV64I-NEXT: tail bar_i64
773+
; RV64I-NEXT: .LBB46_2:
774+
; RV64I-NEXT: ret
775+
;
776+
; RV64ZBB-LABEL: zext_nneg_dominating_icmp_i64:
777+
; RV64ZBB: # %bb.0:
778+
; RV64ZBB-NEXT: bltz a0, .LBB46_2
779+
; RV64ZBB-NEXT: # %bb.1:
780+
; RV64ZBB-NEXT: zext.h a0, a0
781+
; RV64ZBB-NEXT: tail bar_i64
782+
; RV64ZBB-NEXT: .LBB46_2:
783+
; RV64ZBB-NEXT: ret
784+
%2 = icmp sgt i16 %0, -1
785+
br i1 %2, label %3, label %5
786+
787+
3:
788+
%4 = zext nneg i16 %0 to i64
789+
tail call void @bar_i64(i64 %4)
790+
br label %5
791+
792+
5:
793+
ret void
794+
}
795+
796+
declare void @bar_i64(i64)
797+
798+
define void @zext_nneg_dominating_icmp_i32(i16 signext %0) {
799+
; RV32I-LABEL: zext_nneg_dominating_icmp_i32:
800+
; RV32I: # %bb.0:
801+
; RV32I-NEXT: bltz a0, .LBB47_2
802+
; RV32I-NEXT: # %bb.1:
803+
; RV32I-NEXT: slli a0, a0, 16
804+
; RV32I-NEXT: srli a0, a0, 16
805+
; RV32I-NEXT: tail bar_i32
806+
; RV32I-NEXT: .LBB47_2:
807+
; RV32I-NEXT: ret
808+
;
809+
; RV64I-LABEL: zext_nneg_dominating_icmp_i32:
810+
; RV64I: # %bb.0:
811+
; RV64I-NEXT: bltz a0, .LBB47_2
812+
; RV64I-NEXT: # %bb.1:
813+
; RV64I-NEXT: slli a0, a0, 48
814+
; RV64I-NEXT: srli a0, a0, 48
815+
; RV64I-NEXT: tail bar_i32
816+
; RV64I-NEXT: .LBB47_2:
817+
; RV64I-NEXT: ret
818+
;
819+
; RV64ZBB-LABEL: zext_nneg_dominating_icmp_i32:
820+
; RV64ZBB: # %bb.0:
821+
; RV64ZBB-NEXT: bltz a0, .LBB47_2
822+
; RV64ZBB-NEXT: # %bb.1:
823+
; RV64ZBB-NEXT: zext.h a0, a0
824+
; RV64ZBB-NEXT: tail bar_i32
825+
; RV64ZBB-NEXT: .LBB47_2:
826+
; RV64ZBB-NEXT: ret
827+
%2 = icmp sgt i16 %0, -1
828+
br i1 %2, label %3, label %5
829+
830+
3:
831+
%4 = zext nneg i16 %0 to i32
832+
tail call void @bar_i32(i32 %4)
833+
br label %5
834+
835+
5:
836+
ret void
837+
}
838+
839+
declare void @bar_i32(i32)

0 commit comments

Comments
 (0)