# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -debugify-and-strip-all-safe -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombiner-only-enable-rule="icmp_to_true_false_known_bits" -global-isel -verify-machineinstrs %s -o - | FileCheck %s
# REQUIRES: asserts
--- |
define i1 @eq_true(ptr %ptr) { unreachable }
define i1 @ne_true(ptr %ptr) { unreachable }
define i1 @sge_true(ptr %ptr) { unreachable }
define i1 @sgt_true(ptr %ptr) { unreachable }
define i1 @sle_true(ptr %ptr) { unreachable }
define i1 @slt_true(ptr %ptr) { unreachable }
define i1 @uge_true(ptr %ptr) { unreachable }
define i1 @ugt_true(ptr %ptr) { unreachable }
define i1 @ule_true(ptr %ptr) { unreachable }
define i1 @ult_true(ptr %ptr) { unreachable }
define i1 @eq_false(ptr %ptr) { unreachable }
define i1 @ne_false(ptr %ptr) { unreachable }
define i1 @sge_false(ptr %ptr) { unreachable }
define i1 @sgt_false(ptr %ptr) { unreachable }
define i1 @sle_false(ptr %ptr) { unreachable }
define i1 @slt_false(ptr %ptr) { unreachable }
define i1 @uge_false(ptr %ptr) { unreachable }
define i1 @ugt_false(ptr %ptr) { unreachable }
define i1 @ule_false(ptr %ptr) { unreachable }
define i1 @ult_false(ptr %ptr) { unreachable }
define i1 @eq_unknown(ptr %ptr) { unreachable }
define i1 @ne_unknown(ptr %ptr) { unreachable }
define i1 @vector_true(ptr %ptr) { unreachable }
define i1 @vector_false(ptr %ptr) { unreachable }
!0 = !{i32 1, i32 2}
!1 = !{i32 1, i32 3}
...
---
name: eq_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: eq_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%cmp:_(s1) = G_ICMP intpred(eq), %cst(s32), %cst
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ne_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ne_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst_1:_(s32) = G_CONSTANT i32 1
%cst_2:_(s32) = G_CONSTANT i32 2
%cmp:_(s1) = G_ICMP intpred(ne), %cst_1(s32), %cst_2
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sge_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sge_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 2
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sge), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sgt_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sgt_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 3
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sgt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sle_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sle_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sle), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: slt_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: slt_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 -1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(slt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: uge_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: uge_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 2
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(uge), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ugt_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ugt_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 -1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ugt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ule_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ule_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ule), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ult_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ult_true
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 true
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 0
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ule), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: eq_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: eq_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 0
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(eq), %load_eq_1(s32), %cst
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ne_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ne_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst_1:_(s32) = G_CONSTANT i32 1
%cst_2:_(s32) = G_CONSTANT i32 1
%cmp:_(s1) = G_ICMP intpred(ne), %cst_1(s32), %cst_2
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sge_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sge_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 -1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sge), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sgt_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sgt_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sgt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: sle_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: sle_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 3
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(sle), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: slt_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: slt_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 2
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(slt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: uge_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: uge_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 0
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(uge), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ugt_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ugt_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ugt), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ule_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ule_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 -1
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ule), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ult_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ult_false
; CHECK: liveins: $x0
; CHECK: %cmp:_(s1) = G_CONSTANT i1 false
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 2
%load_eq_1:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !0)
%cmp:_(s1) = G_ICMP intpred(ule), %cst, %load_eq_1(s32)
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: eq_unknown
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: eq_unknown
; CHECK: liveins: $x0
; CHECK: %ptr:_(p0) = COPY $x0
; CHECK: %cst:_(s32) = G_CONSTANT i32 1
; CHECK: %load_between_1_2:_(s32) = G_LOAD %ptr(p0) :: (load (s32),
; CHECK: %cmp:_(s1) = G_ICMP intpred(eq), %load_between_1_2(s32), %cst
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_between_1_2:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !1)
%cmp:_(s1) = G_ICMP intpred(eq), %load_between_1_2(s32), %cst
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: ne_unknown
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: ne_unknown
; CHECK: liveins: $x0
; CHECK: %ptr:_(p0) = COPY $x0
; CHECK: %cst:_(s32) = G_CONSTANT i32 1
; CHECK: %load_between_1_2:_(s32) = G_LOAD %ptr(p0) :: (load (s32),
; CHECK: %cmp:_(s1) = G_ICMP intpred(ne), %load_between_1_2(s32), %cst
; CHECK: %cmp_ext:_(s32) = G_ZEXT %cmp(s1)
; CHECK: $w0 = COPY %cmp_ext(s32)
; CHECK: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%load_between_1_2:_(s32) = G_LOAD %ptr(p0) :: (load (s32), !range !1)
%cmp:_(s1) = G_ICMP intpred(ne), %load_between_1_2(s32), %cst
%cmp_ext:_(s32) = G_ZEXT %cmp(s1)
$w0 = COPY %cmp_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: vector_true
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: vector_true
; CHECK: liveins: $x0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %cst64:_(s64) = G_CONSTANT i64 1
; CHECK-NEXT: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
; CHECK-NEXT: %cmp:_(<2 x s1>) = G_BUILD_VECTOR [[C]](s1), [[C]](s1)
; CHECK-NEXT: %extract:_(s1) = G_EXTRACT_VECTOR_ELT %cmp(<2 x s1>), %cst64(s64)
; CHECK-NEXT: %extract_ext:_(s32) = G_ZEXT %extract(s1)
; CHECK-NEXT: $w0 = COPY %extract_ext(s32)
; CHECK-NEXT: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%cst64:_(s64) = G_CONSTANT i64 1
%bv:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
%cmp:_(<2 x s1>) = G_ICMP intpred(eq), %bv(<2 x s32>), %bv
%extract:_(s1) = G_EXTRACT_VECTOR_ELT %cmp(<2 x s1>), %cst64(s64)
%extract_ext:_(s32) = G_ZEXT %extract(s1)
$w0 = COPY %extract_ext(s32)
RET_ReallyLR implicit $w0
...
---
name: vector_false
tracksRegLiveness: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: vector_false
; CHECK: liveins: $x0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: %cst64:_(s64) = G_CONSTANT i64 1
; CHECK-NEXT: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 false
; CHECK-NEXT: %cmp:_(<2 x s1>) = G_BUILD_VECTOR [[C]](s1), [[C]](s1)
; CHECK-NEXT: %extract:_(s1) = G_EXTRACT_VECTOR_ELT %cmp(<2 x s1>), %cst64(s64)
; CHECK-NEXT: %extract_ext:_(s32) = G_ZEXT %extract(s1)
; CHECK-NEXT: $w0 = COPY %extract_ext(s32)
; CHECK-NEXT: RET_ReallyLR implicit $w0
%ptr:_(p0) = COPY $x0
%cst:_(s32) = G_CONSTANT i32 1
%cst64:_(s64) = G_CONSTANT i64 1
%bv:_(<2 x s32>) = G_BUILD_VECTOR %cst, %cst
%cmp:_(<2 x s1>) = G_ICMP intpred(ne), %bv(<2 x s32>), %bv
%extract:_(s1) = G_EXTRACT_VECTOR_ELT %cmp(<2 x s1>), %cst64(s64)
%extract_ext:_(s32) = G_ZEXT %extract(s1)
$w0 = COPY %extract_ext(s32)
RET_ReallyLR implicit $w0