222 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mattr=+sve < %s | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6 7define i1 @extract_icmp_v4i32_const_splat_rhs(<4 x i32> %a) {8; CHECK-LABEL: extract_icmp_v4i32_const_splat_rhs:9; CHECK: // %bb.0:10; CHECK-NEXT: mov w8, v0.s[1]11; CHECK-NEXT: cmp w8, #512; CHECK-NEXT: cset w0, lo13; CHECK-NEXT: ret14 %icmp = icmp ult <4 x i32> %a, splat (i32 5)15 %ext = extractelement <4 x i1> %icmp, i32 116 ret i1 %ext17}18 19define i1 @extract_icmp_v4i32_const_splat_lhs(<4 x i32> %a) {20; CHECK-LABEL: extract_icmp_v4i32_const_splat_lhs:21; CHECK: // %bb.0:22; CHECK-NEXT: mov w8, v0.s[1]23; CHECK-NEXT: cmp w8, #724; CHECK-NEXT: cset w0, hi25; CHECK-NEXT: ret26 %icmp = icmp ult <4 x i32> splat(i32 7), %a27 %ext = extractelement <4 x i1> %icmp, i32 128 ret i1 %ext29}30 31define i1 @extract_icmp_v4i32_const_vec_rhs(<4 x i32> %a) {32; CHECK-LABEL: extract_icmp_v4i32_const_vec_rhs:33; CHECK: // %bb.0:34; CHECK-NEXT: mov w8, v0.s[1]35; CHECK-NEXT: cmp w8, #23436; CHECK-NEXT: cset w0, lo37; CHECK-NEXT: ret38 %icmp = icmp ult <4 x i32> %a, <i32 5, i32 234, i32 -1, i32 7>39 %ext = extractelement <4 x i1> %icmp, i32 140 ret i1 %ext41}42 43define i1 @extract_fcmp_v4f32_const_splat_rhs(<4 x float> %a) {44; CHECK-LABEL: extract_fcmp_v4f32_const_splat_rhs:45; CHECK: // %bb.0:46; CHECK-NEXT: mov s0, v0.s[1]47; CHECK-NEXT: fmov s1, #4.0000000048; CHECK-NEXT: fcmp s0, s149; CHECK-NEXT: cset w0, lt50; CHECK-NEXT: ret51 %fcmp = fcmp ult <4 x float> %a, splat(float 4.0e+0)52 %ext = extractelement <4 x i1> %fcmp, i32 153 ret i1 %ext54}55 56; Tests the code in ExpandIntRes_SETCC57define i128 @extract_icmp_v1i128(ptr %p) {58; CHECK-LABEL: extract_icmp_v1i128:59; CHECK: // %bb.0:60; CHECK-NEXT: ldp x9, x8, [x0]61; CHECK-NEXT: orr x8, x9, x862; CHECK-NEXT: cmp x8, #063; CHECK-NEXT: cset w8, eq64; CHECK-NEXT: sbfx x0, x8, #0, #165; CHECK-NEXT: mov x1, x066; CHECK-NEXT: ret67 %load = load <1 x i128>, ptr %p, align 1668 %cmp = icmp eq <1 x i128> %load, zeroinitializer69 %sext = sext <1 x i1> %cmp to <1 x i128>70 %res = extractelement <1 x i128> %sext, i32 071 ret i128 %res72}73 74define void @vector_loop_with_icmp(ptr nocapture noundef writeonly %dest) {75; CHECK-LABEL: vector_loop_with_icmp:76; CHECK: // %bb.0: // %entry77; CHECK-NEXT: index z0.d, #0, #178; CHECK-NEXT: mov z1.d, #2 // =0x279; CHECK-NEXT: add x8, x0, #480; CHECK-NEXT: mov w9, #16 // =0x1081; CHECK-NEXT: mov w10, #1 // =0x182; CHECK-NEXT: b .LBB5_283; CHECK-NEXT: .LBB5_1: // %pred.store.continue684; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=185; CHECK-NEXT: add v0.2d, v0.2d, v1.2d86; CHECK-NEXT: subs x9, x9, #287; CHECK-NEXT: add x8, x8, #888; CHECK-NEXT: b.eq .LBB5_689; CHECK-NEXT: .LBB5_2: // %vector.body90; CHECK-NEXT: // =>This Inner Loop Header: Depth=191; CHECK-NEXT: fmov x11, d092; CHECK-NEXT: cmp x11, #1493; CHECK-NEXT: b.hi .LBB5_494; CHECK-NEXT: // %bb.3: // %pred.store.if95; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=196; CHECK-NEXT: stur w10, [x8, #-4]97; CHECK-NEXT: .LBB5_4: // %pred.store.continue98; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=199; CHECK-NEXT: mov x11, v0.d[1]100; CHECK-NEXT: cmp x11, #14101; CHECK-NEXT: b.hi .LBB5_1102; CHECK-NEXT: // %bb.5: // %pred.store.if5103; CHECK-NEXT: // in Loop: Header=BB5_2 Depth=1104; CHECK-NEXT: str w10, [x8]105; CHECK-NEXT: b .LBB5_1106; CHECK-NEXT: .LBB5_6: // %for.cond.cleanup107; CHECK-NEXT: ret108entry:109 br label %vector.body110 111vector.body:112 %index = phi i64 [ 0, %entry ], [ %index.next, %pred.store.continue6 ]113 %vec.ind = phi <2 x i64> [ <i64 0, i64 1>, %entry ], [ %vec.ind.next, %pred.store.continue6 ]114 %vec.cmp = icmp ult <2 x i64> %vec.ind, <i64 15, i64 15>115 %c0 = extractelement <2 x i1> %vec.cmp, i64 0116 br i1 %c0, label %pred.store.if, label %pred.store.continue117 118pred.store.if:119 %arrayidx = getelementptr inbounds i32, ptr %dest, i64 %index120 store i32 1, ptr %arrayidx, align 4121 br label %pred.store.continue122 123pred.store.continue:124 %c1 = extractelement <2 x i1> %vec.cmp, i64 1125 br i1 %c1, label %pred.store.if5, label %pred.store.continue6126 127pred.store.if5:128 %indexp1 = or disjoint i64 %index, 1129 %arrayidx2 = getelementptr inbounds i32, ptr %dest, i64 %indexp1130 store i32 1, ptr %arrayidx2, align 4131 br label %pred.store.continue6132 133pred.store.continue6:134 %index.next = add i64 %index, 2135 %vec.ind.next = add <2 x i64> %vec.ind, <i64 2, i64 2>136 %index.cmp = icmp eq i64 %index.next, 16137 br i1 %index.cmp, label %for.cond.cleanup, label %vector.body138 139for.cond.cleanup:140 ret void141}142 143 144define i32 @issue_121372(<4 x i32> %v) {145; CHECK-LABEL: issue_121372:146; CHECK: // %bb.0:147; CHECK-NEXT: fmov w8, s0148; CHECK-NEXT: cmp w8, #0149; CHECK-NEXT: csetm w8, eq150; CHECK-NEXT: cmp w8, #1151; CHECK-NEXT: csetm w0, lt152; CHECK-NEXT: ret153 %cmp_ule = icmp ule <4 x i32> %v, zeroinitializer154 %sext_v4i1 = sext <4 x i1> %cmp_ule to <4 x i32>155 %cmp_sge = icmp sge <4 x i32> zeroinitializer, %sext_v4i1156 %ext = extractelement <4 x i1> %cmp_sge, i32 0157 %res = sext i1 %ext to i32158 ret i32 %res159}160 161 162; Negative tests163 164define i1 @extract_icmp_v4i32_splat_rhs(<4 x i32> %a, i32 %b) {165; CHECK-LABEL: extract_icmp_v4i32_splat_rhs:166; CHECK: // %bb.0:167; CHECK-NEXT: dup v1.4s, w0168; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s169; CHECK-NEXT: xtn v0.4h, v0.4s170; CHECK-NEXT: umov w8, v0.h[1]171; CHECK-NEXT: and w0, w8, #0x1172; CHECK-NEXT: ret173 %ins = insertelement <4 x i32> poison, i32 %b, i32 0174 %splat = shufflevector <4 x i32> %ins, <4 x i32> poison, <4 x i32> zeroinitializer175 %icmp = icmp ult <4 x i32> %a, %splat176 %ext = extractelement <4 x i1> %icmp, i32 1177 ret i1 %ext178}179 180define i1 @extract_icmp_v4i32_splat_rhs_mul_use(<4 x i32> %a, ptr %p) {181; CHECK-LABEL: extract_icmp_v4i32_splat_rhs_mul_use:182; CHECK: // %bb.0:183; CHECK-NEXT: movi v1.4s, #235184; CHECK-NEXT: adrp x8, .LCPI8_0185; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI8_0]186; CHECK-NEXT: mov x8, x0187; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s188; CHECK-NEXT: xtn v1.4h, v0.4s189; CHECK-NEXT: and v0.16b, v0.16b, v2.16b190; CHECK-NEXT: addv s0, v0.4s191; CHECK-NEXT: umov w9, v1.h[1]192; CHECK-NEXT: str b0, [x8]193; CHECK-NEXT: and w0, w9, #0x1194; CHECK-NEXT: ret195 %icmp = icmp ult <4 x i32> %a, splat(i32 235)196 %ext = extractelement <4 x i1> %icmp, i32 1197 store <4 x i1> %icmp, ptr %p, align 4198 ret i1 %ext199}200 201define i1 @extract_icmp_v4i32_splat_rhs_unknown_idx(<4 x i32> %a, i32 %c) {202; CHECK-LABEL: extract_icmp_v4i32_splat_rhs_unknown_idx:203; CHECK: // %bb.0:204; CHECK-NEXT: sub sp, sp, #16205; CHECK-NEXT: .cfi_def_cfa_offset 16206; CHECK-NEXT: movi v1.4s, #127207; CHECK-NEXT: add x8, sp, #8208; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0209; CHECK-NEXT: bfi x8, x0, #1, #2210; CHECK-NEXT: cmhi v0.4s, v1.4s, v0.4s211; CHECK-NEXT: xtn v0.4h, v0.4s212; CHECK-NEXT: str d0, [sp, #8]213; CHECK-NEXT: ldrh w8, [x8]214; CHECK-NEXT: and w0, w8, #0x1215; CHECK-NEXT: add sp, sp, #16216; CHECK-NEXT: ret217 %icmp = icmp ult <4 x i32> %a, splat(i32 127)218 %ext = extractelement <4 x i1> %icmp, i32 %c219 ret i1 %ext220}221 222