# 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
...