CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
472 lines
17 KiB
YAML
472 lines
17 KiB
YAML
# 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: %two:_(s64) = G_CONSTANT i64 2
|
|
; CHECK-NEXT: %cmp1:_(s1) = G_ICMP intpred(eq), [[COPY]](s64), %one
|
|
; CHECK-NEXT: %cmp2:_(s1) = G_ICMP intpred(ne), [[COPY]](s64), %two
|
|
; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(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: %zext:_(s64) = G_CONSTANT i64 0
|
|
; CHECK-NEXT: $x0 = COPY %zext(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
|
|
...
|
|
---
|
|
# icmp (x, v1) && icmp (x, v2)) -> x
|
|
name: test_icmp_and_icmp_with_vectors
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_icmp_and_icmp_with_vectors
|
|
; CHECK: liveins: $x0, $x1
|
|
; 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: [[COPY4:%[0-9]+]]:_(s64) = COPY $x4
|
|
; CHECK-NEXT: [[COPY5:%[0-9]+]]:_(s64) = COPY $x5
|
|
; CHECK-NEXT: [[COPY6:%[0-9]+]]:_(s64) = COPY $x6
|
|
; CHECK-NEXT: [[COPY7:%[0-9]+]]:_(s64) = COPY $x7
|
|
; CHECK-NEXT: %v1:_(<2 x s64>) = G_BUILD_VECTOR [[COPY]](s64), [[COPY1]](s64)
|
|
; CHECK-NEXT: %v2:_(<2 x s64>) = G_BUILD_VECTOR [[COPY2]](s64), [[COPY3]](s64)
|
|
; CHECK-NEXT: %v3:_(<2 x s64>) = G_BUILD_VECTOR [[COPY4]](s64), [[COPY5]](s64)
|
|
; CHECK-NEXT: %v4:_(<2 x s64>) = G_BUILD_VECTOR [[COPY6]](s64), [[COPY7]](s64)
|
|
; CHECK-NEXT: %cmp1:_(<2 x s1>) = G_ICMP intpred(ne), %v1(<2 x s64>), %v2
|
|
; CHECK-NEXT: %cmp2:_(<2 x s1>) = G_ICMP intpred(eq), %v3(<2 x s64>), %v4
|
|
; CHECK-NEXT: %and:_(<2 x s1>) = G_AND %cmp1, %cmp2
|
|
; CHECK-NEXT: %zext:_(<2 x s64>) = G_ZEXT %and(<2 x s1>)
|
|
; CHECK-NEXT: $q0 = COPY %zext(<2 x s64>)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%2:_(s64) = COPY $x2
|
|
%3:_(s64) = COPY $x3
|
|
%4:_(s64) = COPY $x4
|
|
%5:_(s64) = COPY $x5
|
|
%6:_(s64) = COPY $x6
|
|
%7:_(s64) = COPY $x7
|
|
%nine:_(s64) = G_CONSTANT i64 9
|
|
%two:_(s64) = G_CONSTANT i64 2
|
|
%v1:_(<2 x s64>) = G_BUILD_VECTOR %0(s64), %1(s64)
|
|
%v2:_(<2 x s64>) = G_BUILD_VECTOR %2(s64), %3(s64)
|
|
%v3:_(<2 x s64>) = G_BUILD_VECTOR %4(s64), %5(s64)
|
|
%v4:_(<2 x s64>) = G_BUILD_VECTOR %6(s64), %7(s64)
|
|
%cmp1:_(<2 x s1>) = G_ICMP intpred(ne), %v1(<2 x s64>), %v2
|
|
%cmp2:_(<2 x s1>) = G_ICMP intpred(eq), %v3(<2 x s64>), %v4
|
|
%and:_(<2 x s1>) = G_AND %cmp1, %cmp2
|
|
%zext:_(<2 x s64>) = G_ZEXT %and(<2 x s1>)
|
|
$q0 = COPY %zext
|
|
...
|
|
---
|
|
# fcmp (x, y) || fcmp (x, y) -> fcmp(x, y)
|
|
name: test_fcmp_or_fcmp_with_x_y
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_or_fcmp_with_x_y
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
|
|
; CHECK-NEXT: [[FCMP:%[0-9]+]]:_(s1) = G_FCMP floatpred(ueq), [[COPY]](s64), [[COPY1]]
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[FCMP]](s1)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%cmp1:_(s1) = G_FCMP floatpred(oeq), %0(s64), %1
|
|
%cmp2:_(s1) = G_FCMP floatpred(uno), %0(s64), %1
|
|
%or:_(s1) = G_OR %cmp1, %cmp2
|
|
%zext:_(s64) = G_ZEXT %or(s1)
|
|
$x0 = COPY %zext
|
|
...
|
|
---
|
|
# fcmp (5, y) || fcmp (y, 5) -> fcmp(x, y)
|
|
name: test_fcmp_or_fcmp_with_5_y
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_or_fcmp_with_5_y
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
|
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 5.000000e+00
|
|
; CHECK-NEXT: [[FCMP:%[0-9]+]]:_(s1) = G_FCMP floatpred(une), [[COPY]](s64), [[C]]
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[FCMP]](s1)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%2:_(s64) = G_FCONSTANT double 5.0
|
|
%cmp1:_(s1) = G_FCMP floatpred(one), %0(s64), %2
|
|
%cmp2:_(s1) = G_FCMP floatpred(uno), %0(s64), %2
|
|
%or:_(s1) = G_OR %cmp1, %cmp2
|
|
%zext:_(s64) = G_ZEXT %or(s1)
|
|
$x0 = COPY %zext
|
|
...
|
|
---
|
|
# fcmp (x, y) || fcmp (y, x) -> fcmp(x, y)
|
|
name: test_fcmp_or_fcmp_with_anti
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_or_fcmp_with_anti
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
|
|
; CHECK-NEXT: [[FCMP:%[0-9]+]]:_(s1) = G_FCMP floatpred(une), [[COPY1]](s64), [[COPY]]
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[FCMP]](s1)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%cmp1:_(s1) = G_FCMP floatpred(one), %1(s64), %0
|
|
%cmp2:_(s1) = G_FCMP floatpred(uno), %0(s64), %1
|
|
%or:_(s1) = G_OR %cmp1, %cmp2
|
|
%zext:_(s64) = G_ZEXT %or(s1)
|
|
$x0 = COPY %zext
|
|
...
|
|
---
|
|
# fcmp (x, y) && fcmp (x, y) -> fcmp(x, y)
|
|
name: test_fcmp_and_fcmp_with_x_y
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_and_fcmp_with_x_y
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
|
|
; CHECK-NEXT: [[FCMP:%[0-9]+]]:_(s1) = G_FCMP floatpred(uno), [[COPY1]](s64), [[COPY]]
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT [[FCMP]](s1)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%cmp1:_(s1) = G_FCMP floatpred(une), %1(s64), %0
|
|
%cmp2:_(s1) = G_FCMP floatpred(uno), %0(s64), %1
|
|
%and:_(s1) = G_AND %cmp1, %cmp2
|
|
%zext:_(s64) = G_ZEXT %and(s1)
|
|
$x0 = COPY %zext
|
|
...
|
|
---
|
|
# fcmp (x, y) && fcmp (x, y) -> fcmp(x, y)
|
|
name: test_fcmp_and_fcmp_with_x_y_multi_use
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_and_fcmp_with_x_y_multi_use
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
|
|
; CHECK-NEXT: %cmp1:_(s1) = G_FCMP floatpred(ogt), [[COPY1]](s64), [[COPY]]
|
|
; CHECK-NEXT: %cmp2:_(s1) = G_FCMP floatpred(ugt), [[COPY]](s64), [[COPY1]]
|
|
; CHECK-NEXT: %and:_(s1) = G_AND %cmp1, %cmp2
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT %and(s1)
|
|
; CHECK-NEXT: %zext2:_(s64) = G_ZEXT %and(s1)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
; CHECK-NEXT: $x2 = COPY %zext2(s64)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%cmp1:_(s1) = G_FCMP floatpred(ogt), %1(s64), %0
|
|
%cmp2:_(s1) = G_FCMP floatpred(ugt), %0(s64), %1
|
|
%and:_(s1) = G_AND %cmp1, %cmp2
|
|
%zext:_(s64) = G_ZEXT %and(s1)
|
|
%zext2:_(s64) = G_ZEXT %and(s1)
|
|
$x0 = COPY %zext
|
|
$x2 = COPY %zext2
|
|
...
|
|
---
|
|
# fcmp (x, y) && fcmp (x, y) -> fcmp(x, y)
|
|
name: test_fcmp_and_fcmp_with_vectors
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: test_fcmp_and_fcmp_with_vectors
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
|
|
; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s1>) = G_BUILD_VECTOR [[C]](s1), [[C]](s1)
|
|
; CHECK-NEXT: %zext:_(<2 x s64>) = G_ZEXT [[BUILD_VECTOR]](<2 x s1>)
|
|
; CHECK-NEXT: $q0 = COPY %zext(<2 x s64>)
|
|
%0:_(s64) = COPY $x0
|
|
%1:_(s64) = COPY $x1
|
|
%2:_(s64) = COPY $x2
|
|
%3:_(s64) = COPY $x3
|
|
%4:_(s64) = COPY $x4
|
|
%5:_(s64) = COPY $x5
|
|
%6:_(s64) = COPY $x6
|
|
%7:_(s64) = COPY $x7
|
|
%v8:_(<2 x s64>) = G_BUILD_VECTOR %0(s64), %1(s64)
|
|
%v9:_(<2 x s64>) = G_BUILD_VECTOR %2(s64), %3(s64)
|
|
%cmp1:_(<2 x s1>) = G_FCMP floatpred(oeq), %v8(<2 x s64>), %v9
|
|
%cmp2:_(<2 x s1>) = G_FCMP floatpred(olt), %v8(<2 x s64>), %v9
|
|
%and:_(<2 x s1>) = G_AND %cmp1, %cmp2
|
|
%zext:_(<2 x s64>) = G_ZEXT %and(<2 x s1>)
|
|
$q0 = COPY %zext
|
|
...
|
|
---
|
|
name: test_dont_combine_pointers
|
|
body: |
|
|
; CHECK-LABEL: name: test_dont_combine_pointers
|
|
; CHECK: bb.0:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[C:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
|
|
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -8
|
|
; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[C1]](s64)
|
|
; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 -16
|
|
; CHECK-NEXT: [[INTTOPTR1:%[0-9]+]]:_(p0) = G_INTTOPTR [[C2]](s64)
|
|
; CHECK-NEXT: [[C3:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.1:
|
|
; CHECK-NEXT: successors: %bb.2(0x60000000), %bb.3(0x20000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(p0) = G_LOAD [[C]](p0) :: (load (p0))
|
|
; CHECK-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR]]
|
|
; CHECK-NEXT: [[ICMP1:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[LOAD]](p0), [[INTTOPTR1]]
|
|
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s1) = G_AND [[ICMP]], [[ICMP1]]
|
|
; CHECK-NEXT: G_BRCOND [[AND]](s1), %bb.3
|
|
; CHECK-NEXT: G_BR %bb.2
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.2:
|
|
; CHECK-NEXT: successors: %bb.1(0x55555555), %bb.3(0x2aaaaaab)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: G_BRCOND [[C3]](s1), %bb.1
|
|
; CHECK-NEXT: G_BR %bb.3
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.3:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: G_BR %bb.1
|
|
bb.1:
|
|
%1:_(p0) = G_CONSTANT i64 0
|
|
%3:_(s64) = G_CONSTANT i64 -8
|
|
%2:_(p0) = G_INTTOPTR %3(s64)
|
|
%6:_(s64) = G_CONSTANT i64 -16
|
|
%5:_(p0) = G_INTTOPTR %6(s64)
|
|
%10:_(s1) = G_CONSTANT i1 false
|
|
|
|
bb.2:
|
|
successors: %bb.4(0x60000000), %bb.3(0x20000000)
|
|
|
|
%0:_(p0) = G_LOAD %1(p0) :: (load (p0))
|
|
%4:_(s1) = G_ICMP intpred(eq), %0(p0), %2
|
|
%7:_(s1) = G_ICMP intpred(eq), %0(p0), %5
|
|
%8:_(s1) = G_OR %4, %7
|
|
%9:_(s1) = G_SELECT %8(s1), %10, %10
|
|
G_BRCOND %8(s1), %bb.4
|
|
G_BR %bb.3
|
|
|
|
bb.4:
|
|
successors: %bb.2(0x55555555), %bb.3(0x2aaaaaab)
|
|
|
|
G_BRCOND %10(s1), %bb.2
|
|
G_BR %bb.3
|
|
|
|
bb.3:
|
|
G_BR %bb.2
|
|
|
|
...
|