[llvm] [GlobalIsel] Combine logic of icmps (PR #77855)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 11 20:16:39 PST 2024
================
@@ -0,0 +1,214 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -debugify-and-strip-all-safe -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs -mtriple aarch64-unknown-unknown %s -o - | FileCheck %s
+---
+# icmp (x, 1) && icmp (x, 2) -> x
+name: test_icmp_and_icmp
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_and_icmp
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[ICMP]](s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 1
+ %two:_(s64) = G_CONSTANT i64 2
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(ne), %0(s64), %two
+ %and:_(s1) = G_AND %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %and(s1)
+ $x0 = COPY %zext
+...
+---
+# multi use icmp (x, 1) && icmp (x, 2) -> x
+name: multi_use_test_icmp_and_icmp
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: multi_use_test_icmp_and_icmp
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1
+ ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[ICMP]](s1)
+ ; CHECK-NEXT: %cmp1zext:_(s64) = G_ZEXT %cmp1(s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ ; CHECK-NEXT: $x0 = COPY %cmp1zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 1
+ %two:_(s64) = G_CONSTANT i64 2
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(ne), %0(s64), %two
+ %and:_(s1) = G_AND %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %and(s1)
+ %cmp1zext:_(s64) = G_ZEXT %cmp1(s1)
+ $x0 = COPY %zext
+ $x0 = COPY %cmp1zext
+...
+---
+# icmp (x, 1) && icmp (x, add(x, 2)) -> x
+name: test_icmp_and_icmp_with_add
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_and_icmp_with_add
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 1
+ ; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %cmp1(s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 1
+ %two:_(s64) = G_CONSTANT i64 2
+ %add:_(s64) = G_ADD %0(s64), %two
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(ne), %0(s64), %add
+ %and:_(s1) = G_AND %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %and(s1)
+ $x0 = COPY %zext
+...
+---
+# icmp (x, 1) && icmp (x, add(x, 2000)) -> x
+name: test_icmp_or_icmp_with_add_2000
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_or_icmp_with_add_2000
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %one:_(s64) = G_CONSTANT i64 -100
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[ICMP]](s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 -100
+ %two:_(s64) = G_CONSTANT i64 2000
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(ne), %0(s64), %two
+ %or:_(s1) = G_AND %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %or(s1)
+ $x0 = COPY %zext
+...
+---
+# icmp (x, -100) || icmp (x, 2000) -> x
+name: test_icmp_or_icmp
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_or_icmp
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: %two:_(s64) = G_CONSTANT i64 2000
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY]](s64), %two
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[ICMP]](s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 -100
+ %two:_(s64) = G_CONSTANT i64 2000
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(ne), %0(s64), %two
+ %or:_(s1) = G_OR %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %or(s1)
+ $x0 = COPY %zext
+...
+---
+# offset icmp (x, -100) || icmp (x, 2000) -> x
+name: test_icmp_or_icmp_offset
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_or_icmp_offset
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -2001
+ ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(s64) = G_ADD [[COPY]], [[C]]
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -2101
+ ; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ult), [[ADD]](s64), [[C1]]
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[ICMP]](s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %one:_(s64) = G_CONSTANT i64 -100
+ %two:_(s64) = G_CONSTANT i64 2000
+ %cmp1:_(s1) = G_ICMP intpred(slt), %0(s64), %one
+ %cmp2:_(s1) = G_ICMP intpred(sgt), %0(s64), %two
+ %or:_(s1) = G_OR %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %or(s1)
+ $x0 = COPY %zext
+...
+---
+# icmp (x, add(x, 9) || icmp (x, add(x, 2)) -> x
+name: test_icmp_or_icmp_with_add_and_add
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_or_icmp_with_add_and_add
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK-NEXT: %two:_(s64) = G_CONSTANT i64 2
+ ; CHECK-NEXT: %add2:_(s64) = G_ADD [[COPY]], %two
+ ; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), [[COPY1]](s64), %add2
+ ; CHECK-NEXT: %zext:_(s64) = G_ZEXT %cmp2(s1)
+ ; CHECK-NEXT: $x0 = COPY %zext(s64)
+ %0:_(s64) = COPY $x0
+ %1:_(s64) = COPY $x1
+ %2:_(s64) = COPY $x2
+ %nine:_(s64) = G_CONSTANT i64 9
+ %two:_(s64) = G_CONSTANT i64 2
+ %add1:_(s64) = G_ADD %0(s64), %nine
+ %add2:_(s64) = G_ADD %0(s64), %two
+ %cmp1:_(s1) = G_ICMP intpred(eq), %0(s64), %add1
+ %cmp2:_(s1) = G_ICMP intpred(ne), %1(s64), %add2
+ %and:_(s1) = G_OR %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %and(s1)
+ $x0 = COPY %zext
+...
+---
+# icmp (x, 9) && icmp (x, 2)) -> x
+# buildConstant 0
+# buildICmp ult, R1, NewC
+# buildZExtOrTrunc -> COPY
+# erase G_AND
+# x > 9 && x < 2 => false
+name: test_icmp_and_icmp_9_2
+body: |
+ bb.1:
+ liveins: $x0, $x1
+ ; CHECK-LABEL: name: test_icmp_and_icmp_9_2
+ ; CHECK: liveins: $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
+ ; CHECK-NEXT: $x0 = COPY [[C]](s64)
+ %0:_(s64) = COPY $x0
+ %nine:_(s64) = G_CONSTANT i64 9
+ %two:_(s64) = G_CONSTANT i64 2
+ %cmp1:_(s1) = G_ICMP intpred(sgt), %0(s64), %nine
+ %cmp2:_(s1) = G_ICMP intpred(slt), %0(s64), %two
+ %and:_(s1) = G_AND %cmp1, %cmp2
+ %zext:_(s64) = G_ZEXT %and(s1)
+ $x0 = COPY %zext
+...
----------------
arsenm wrote:
vector test?
https://github.com/llvm/llvm-project/pull/77855
More information about the llvm-commits
mailing list