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