Skip to content

Commit c9afd1a

Browse files
committed
[RISCV] Add test case showing missed opportunity to form sextload when sext and zext nneg are both present. NFC
1 parent f67ef1a commit c9afd1a

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

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

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -871,3 +871,87 @@ define void @zext_nneg_dominating_icmp_i32_zeroext(i16 signext %0) {
871871
5:
872872
ret void
873873
}
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

Comments
 (0)