Skip to content

Commit c1716e3

Browse files
authored
[DAGCombiner][RISCV] CSE zext nneg and sext. (#82597)
If we have a sext and a zext nneg with the same types and operand we should combine them into the sext. We can't go the other way because the nneg flag may only be valid in the context of the uses of the zext nneg.
1 parent a51f4af commit c1716e3

File tree

2 files changed

+30
-46
lines changed

2 files changed

+30
-46
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13997,6 +13997,13 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
1399713997
if (SDValue Res = tryToFoldExtendSelectLoad(N, TLI, DAG, Level))
1399813998
return Res;
1399913999

14000+
// CSE zext nneg with sext if the zext is not free.
14001+
if (N->getFlags().hasNonNeg() && !TLI.isZExtFree(N0.getValueType(), VT)) {
14002+
SDNode *CSENode = DAG.getNodeIfExists(ISD::SIGN_EXTEND, N->getVTList(), N0);
14003+
if (CSENode)
14004+
return SDValue(CSENode, 0);
14005+
}
14006+
1400014007
return SDValue();
1400114008
}
1400214009

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

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -882,11 +882,10 @@ define void @load_zext_nneg_sext_cse(ptr %p) nounwind {
882882
; RV32I-NEXT: addi sp, sp, -16
883883
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
884884
; 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
885+
; RV32I-NEXT: lh s0, 0(a0)
886+
; RV32I-NEXT: bltz s0, .LBB50_2
888887
; RV32I-NEXT: # %bb.1: # %bb1
889-
; RV32I-NEXT: srai a0, a0, 16
888+
; RV32I-NEXT: mv a0, s0
890889
; RV32I-NEXT: call bar_i16
891890
; RV32I-NEXT: mv a0, s0
892891
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
@@ -899,48 +898,26 @@ define void @load_zext_nneg_sext_cse(ptr %p) nounwind {
899898
; RV32I-NEXT: addi sp, sp, 16
900899
; RV32I-NEXT: ret
901900
;
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
901+
; RV64-LABEL: load_zext_nneg_sext_cse:
902+
; RV64: # %bb.0:
903+
; RV64-NEXT: addi sp, sp, -16
904+
; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
905+
; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
906+
; RV64-NEXT: lh s0, 0(a0)
907+
; RV64-NEXT: bltz s0, .LBB50_2
908+
; RV64-NEXT: # %bb.1: # %bb1
909+
; RV64-NEXT: mv a0, s0
910+
; RV64-NEXT: call bar_i16
911+
; RV64-NEXT: mv a0, s0
912+
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
913+
; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
914+
; RV64-NEXT: addi sp, sp, 16
915+
; RV64-NEXT: tail bar_i32
916+
; RV64-NEXT: .LBB50_2: # %bb2
917+
; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
918+
; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
919+
; RV64-NEXT: addi sp, sp, 16
920+
; RV64-NEXT: ret
944921
%load = load i16, ptr %p
945922
%zext = zext nneg i16 %load to i32
946923
%cmp = icmp sgt i16 %load, -1

0 commit comments

Comments
 (0)