[llvm] [GlobalIsel] Combine select to integer minmax. (PR #77213)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 8 22:52:27 PST 2024
================
@@ -544,3 +544,254 @@ body: |
%ext:_(s32) = G_ANYEXT %sel
$w0 = COPY %ext(s32)
...
+---
+# select test(failed,registers) select icmp_ugt t,f_t_f --> umax(t,f)
+name: select_failed_icmp_ugt_t_f_t_f_umax_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_failed_icmp_ugt_t_f_t_f_umax_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
+ ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $x3
+ ; CHECK-NEXT: %t:_(s8) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f:_(s8) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %y:_(s8) = G_TRUNC [[COPY2]](s64)
+ ; CHECK-NEXT: %z:_(s8) = G_TRUNC [[COPY3]](s64)
+ ; CHECK-NEXT: %c:_(s8) = G_ICMP intpred(ugt), %t(s8), %y
+ ; CHECK-NEXT: %sel:_(s8) = exact G_SELECT %c(s8), %f, %z
+ ; CHECK-NEXT: %ext:_(s32) = G_ANYEXT %sel(s8)
+ ; CHECK-NEXT: $w0 = COPY %ext(s32)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %3:_(s64) = COPY $x3
+ %4:_(s64) = COPY $x4
+ %t:_(s8) = G_TRUNC %0
+ %f:_(s8) = G_TRUNC %1
+ %y:_(s8) = G_TRUNC %2
+ %z:_(s8) = G_TRUNC %3
+ %c:_(s8) = G_ICMP intpred(ugt), %t(s8), %y(s8)
+ %sel:_(s8) = exact G_SELECT %c, %f, %z
+ %ext:_(s32) = G_ANYEXT %sel
+ $w0 = COPY %ext(s32)
+...
+---
+# test select icmp_ugt t,f_t_f --> umax(t,f)
+name: select_icmp_ugt_t_f_t_f_umax_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_ugt_t_f_t_f_umax_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_UMAX %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(ugt), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_uge t,f_t_f --> umax(t,f)
+name: select_icmp_uge_t_f_t_f_umax_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_uge_t_f_t_f_umax_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_UMAX %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(uge), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_sgt t,f_t_f --> smax(t,f)
+name: select_icmp_sgt_t_f_t_f_smax_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_sgt_t_f_t_f_smax_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_SMAX %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(sgt), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_sge t,f_t_f --> smax(t,f)
+name: select_icmp_sge_t_f_t_f_smax_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_sge_t_f_t_f_smax_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_SMAX %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(sge), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_ult t,f_t_f --> umin(t,f)
+name: select_icmp_ult_t_f_t_f_umin_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_ult_t_f_t_f_umin_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_UMIN %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(ult), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_ule t,f_t_f --> umin(t,f)
+name: select_icmp_ule_t_f_t_f_umin_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_ule_t_f_t_f_umin_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_UMIN %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(ule), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+# test select icmp_slt t,f_t_f --> smin(t,f)
+name: select_icmp_slt_t_f_t_f_smin_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_slt_t_f_t_f_smin_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_SMIN %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(slt), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
+---
+#test select icmp_sle t,f_t_f --> smin(t,f)
+name: select_icmp_sle_t_f_t_f_smin_t_f
+body: |
+ bb.1:
+ liveins: $x0, $x1, $x2
+ ; CHECK-LABEL: name: select_icmp_sle_t_f_t_f_smin_t_f
+ ; CHECK: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %t1:_(s32) = G_TRUNC [[COPY]](s64)
+ ; CHECK-NEXT: %f1:_(s32) = G_TRUNC [[COPY1]](s64)
+ ; CHECK-NEXT: %t:_(<4 x s32>) = G_BUILD_VECTOR %t1(s32), %t1(s32), %t1(s32), %t1(s32)
+ ; CHECK-NEXT: %f:_(<4 x s32>) = G_BUILD_VECTOR %f1(s32), %f1(s32), %f1(s32), %f1(s32)
+ ; CHECK-NEXT: %sel:_(<4 x s32>) = G_SMIN %t, %f
+ ; CHECK-NEXT: $q0 = COPY %sel(<4 x s32>)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %t1:_(s32) = G_TRUNC %0
+ %f1:_(s32) = G_TRUNC %1
+ %t:_(<4 x s32>) = G_BUILD_VECTOR %t1, %t1, %t1, %t1
+ %f:_(<4 x s32>) = G_BUILD_VECTOR %f1, %f1, %f1, %f1
+ %c:_(<4 x s32>) = G_ICMP intpred(sle), %t(<4 x s32>), %f(<4 x s32>)
+ %sel:_(<4 x s32>) = exact G_SELECT %c, %t, %f
+ $q0 = COPY %sel(<4 x s32>)
+...
----------------
arsenm wrote:
Add test with multiple uses of the compare
https://github.com/llvm/llvm-project/pull/77213
More information about the llvm-commits
mailing list