Skip to content

Commit 54dac27

Browse files
authored
[GISel][RISCV] Use isSExtCheaperThanZExt when widening G_UMAX/G_UMIN. (#120041)
Similar to what we do for unsigned comparisons after #120032.
1 parent 1158729 commit 54dac27

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2884,15 +2884,12 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
28842884
return Legalized;
28852885
case TargetOpcode::G_UDIV:
28862886
case TargetOpcode::G_UREM:
2887-
case TargetOpcode::G_UMIN:
2888-
case TargetOpcode::G_UMAX:
28892887
Observer.changingInstr(MI);
28902888
widenScalarSrc(MI, WideTy, 1, TargetOpcode::G_ZEXT);
28912889
widenScalarSrc(MI, WideTy, 2, TargetOpcode::G_ZEXT);
28922890
widenScalarDst(MI, WideTy);
28932891
Observer.changedInstr(MI);
28942892
return Legalized;
2895-
28962893
case TargetOpcode::G_UDIVREM:
28972894
Observer.changingInstr(MI);
28982895
widenScalarSrc(MI, WideTy, 2, TargetOpcode::G_ZEXT);
@@ -2901,6 +2898,24 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
29012898
widenScalarDst(MI, WideTy, 1);
29022899
Observer.changedInstr(MI);
29032900
return Legalized;
2901+
case TargetOpcode::G_UMIN:
2902+
case TargetOpcode::G_UMAX: {
2903+
LLT Ty = MRI.getType(MI.getOperand(0).getReg());
2904+
2905+
auto &Ctx = MIRBuilder.getMF().getFunction().getContext();
2906+
unsigned ExtOpc =
2907+
TLI.isSExtCheaperThanZExt(getApproximateEVTForLLT(Ty, Ctx),
2908+
getApproximateEVTForLLT(WideTy, Ctx))
2909+
? TargetOpcode::G_SEXT
2910+
: TargetOpcode::G_ZEXT;
2911+
2912+
Observer.changingInstr(MI);
2913+
widenScalarSrc(MI, WideTy, 1, ExtOpc);
2914+
widenScalarSrc(MI, WideTy, 2, ExtOpc);
2915+
widenScalarDst(MI, WideTy);
2916+
Observer.changedInstr(MI);
2917+
return Legalized;
2918+
}
29042919

29052920
case TargetOpcode::G_SELECT:
29062921
Observer.changingInstr(MI);

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-umax-rv64.mir

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,12 @@ body: |
9999
; RV64ZBB-LABEL: name: umax_i32
100100
; RV64ZBB: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
101101
; RV64ZBB-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
102+
; RV64ZBB-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
103+
; RV64ZBB-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY1]], 32
104+
; RV64ZBB-NEXT: [[UMAX:%[0-9]+]]:_(s64) = G_UMAX [[SEXT_INREG]], [[SEXT_INREG1]]
102105
; RV64ZBB-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4294967295
103-
; RV64ZBB-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
104-
; RV64ZBB-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C]]
105-
; RV64ZBB-NEXT: [[UMAX:%[0-9]+]]:_(s64) = G_UMAX [[AND]], [[AND1]]
106-
; RV64ZBB-NEXT: $x10 = COPY [[UMAX]](s64)
106+
; RV64ZBB-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UMAX]], [[C]]
107+
; RV64ZBB-NEXT: $x10 = COPY [[AND]](s64)
107108
; RV64ZBB-NEXT: PseudoRET implicit $x10
108109
%0:_(s64) = COPY $x10
109110
%1:_(s64) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-umin-rv64.mir

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,12 @@ body: |
9999
; RV64ZBB-LABEL: name: umin_i32
100100
; RV64ZBB: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
101101
; RV64ZBB-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
102+
; RV64ZBB-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY]], 32
103+
; RV64ZBB-NEXT: [[SEXT_INREG1:%[0-9]+]]:_(s64) = G_SEXT_INREG [[COPY1]], 32
104+
; RV64ZBB-NEXT: [[UMIN:%[0-9]+]]:_(s64) = G_UMIN [[SEXT_INREG]], [[SEXT_INREG1]]
102105
; RV64ZBB-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4294967295
103-
; RV64ZBB-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
104-
; RV64ZBB-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C]]
105-
; RV64ZBB-NEXT: [[UMIN:%[0-9]+]]:_(s64) = G_UMIN [[AND]], [[AND1]]
106-
; RV64ZBB-NEXT: $x10 = COPY [[UMIN]](s64)
106+
; RV64ZBB-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UMIN]], [[C]]
107+
; RV64ZBB-NEXT: $x10 = COPY [[AND]](s64)
107108
; RV64ZBB-NEXT: PseudoRET implicit $x10
108109
%0:_(s64) = COPY $x10
109110
%1:_(s64) = COPY $x11

llvm/test/CodeGen/RISCV/GlobalISel/rv64zbb.ll

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -987,12 +987,7 @@ define signext i32 @minu_i32(i32 signext %a, i32 signext %b) nounwind {
987987
;
988988
; RV64ZBB-LABEL: minu_i32:
989989
; RV64ZBB: # %bb.0:
990-
; RV64ZBB-NEXT: slli a0, a0, 32
991-
; RV64ZBB-NEXT: slli a1, a1, 32
992-
; RV64ZBB-NEXT: srli a0, a0, 32
993-
; RV64ZBB-NEXT: srli a1, a1, 32
994990
; RV64ZBB-NEXT: minu a0, a0, a1
995-
; RV64ZBB-NEXT: sext.w a0, a0
996991
; RV64ZBB-NEXT: ret
997992
%cmp = icmp ult i32 %a, %b
998993
%cond = select i1 %cmp, i32 %a, i32 %b
@@ -1031,12 +1026,7 @@ define signext i32 @maxu_i32(i32 signext %a, i32 signext %b) nounwind {
10311026
;
10321027
; RV64ZBB-LABEL: maxu_i32:
10331028
; RV64ZBB: # %bb.0:
1034-
; RV64ZBB-NEXT: slli a0, a0, 32
1035-
; RV64ZBB-NEXT: slli a1, a1, 32
1036-
; RV64ZBB-NEXT: srli a0, a0, 32
1037-
; RV64ZBB-NEXT: srli a1, a1, 32
10381029
; RV64ZBB-NEXT: maxu a0, a0, a1
1039-
; RV64ZBB-NEXT: sext.w a0, a0
10401030
; RV64ZBB-NEXT: ret
10411031
%cmp = icmp ugt i32 %a, %b
10421032
%cond = select i1 %cmp, i32 %a, i32 %b

0 commit comments

Comments
 (0)