From 32dcdb5709c1720df26401ff81a0b71a32cfeb1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Bossu?= Date: Fri, 19 Dec 2025 13:07:47 +0000 Subject: [PATCH 1/3] [AArch64][ISel] Extend insertelement tests This in preparation to adding a DAG combiner for turning INSERT_VECTOR_ELT(undef, ...) -> VECTOR_SPLAT --- .../CodeGen/AArch64/sve-insert-element.ll | 475 +++++++++++++++--- 1 file changed, 411 insertions(+), 64 deletions(-) diff --git a/llvm/test/CodeGen/AArch64/sve-insert-element.ll b/llvm/test/CodeGen/AArch64/sve-insert-element.ll index 8ca005a88add3..5cc54929756ff 100644 --- a/llvm/test/CodeGen/AArch64/sve-insert-element.ll +++ b/llvm/test/CodeGen/AArch64/sve-insert-element.ll @@ -165,31 +165,378 @@ define @test_lanex_16xi8( %a, i32 %x) { ret %b } +; TODO: Implement DAG combiner. +; INSERT_VECTOR_ELT(undef, ...) -> VECTOR_SPLAT -; Redundant lane insert -define @extract_insert_4xi32( %a) { -; CHECK-LABEL: extract_insert_4xi32: +define @test_lanex_16xi8_poison(i8 %e, i32 %x) { +; CHECK-LABEL: test_lanex_16xi8_poison: ; CHECK: // %bb.0: +; CHECK-NEXT: index z0.b, #0, #1 +; CHECK-NEXT: mov w8, w1 +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: mov z1.b, w8 +; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, z1.b +; CHECK-NEXT: mov z0.b, p0/m, w0 ; CHECK-NEXT: ret - %b = extractelement %a, i32 2 - %c = insertelement %a, i32 %b, i32 2 - ret %c + %b = insertelement poison, i8 %e, i32 %x + ret %b } -define @test_lane6_undef_8xi16(i16 %a) { -; CHECK-LABEL: test_lane6_undef_8xi16: +define @test_lanex_16xi8_poison_imm(i8 %e, i32 %x) { +; CHECK-LABEL: test_lanex_16xi8_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.b, #0, #1 +; CHECK-NEXT: mov w8, w1 +; CHECK-NEXT: ptrue p0.b +; CHECK-NEXT: mov z1.b, w8 +; CHECK-NEXT: mov w8, #5 // =0x5 +; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, z1.b +; CHECK-NEXT: mov z0.b, p0/m, w8 +; CHECK-NEXT: ret + %b = insertelement poison, i8 5, i32 %x + ret %b +} + +define @test_lanex_8xi16_poison(i16 %e, i32 %x) { +; CHECK-LABEL: test_lanex_8xi16_poison: ; CHECK: // %bb.0: -; CHECK-NEXT: mov w8, #6 // =0x6 ; CHECK-NEXT: index z0.h, #0, #1 +; CHECK-NEXT: mov w8, w1 ; CHECK-NEXT: ptrue p0.h ; CHECK-NEXT: mov z1.h, w8 ; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h ; CHECK-NEXT: mov z0.h, p0/m, w0 ; CHECK-NEXT: ret - %b = insertelement poison, i16 %a, i32 6 + %b = insertelement poison, i16 %e, i32 %x ret %b } +define @test_lanex_8xi16_poison_imm(i32 %x) { +; CHECK-LABEL: test_lanex_8xi16_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.h, #0, #1 +; CHECK-NEXT: mov w8, w0 +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: mov z1.h, w8 +; CHECK-NEXT: mov w8, #5 // =0x5 +; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h +; CHECK-NEXT: mov z0.h, p0/m, w8 +; CHECK-NEXT: ret + %b = insertelement poison, i16 5, i32 %x + ret %b +} + +define @test_lanex_4xi32_poison(i32 %e, i32 %x) { +; CHECK-LABEL: test_lanex_4xi32_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.s, #0, #1 +; CHECK-NEXT: mov w8, w1 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: mov z1.s, w8 +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s +; CHECK-NEXT: mov z0.s, p0/m, w0 +; CHECK-NEXT: ret + %b = insertelement poison, i32 %e, i32 %x + ret %b +} + +define @test_lanex_4xi32_poison_imm(i32 %x) { +; CHECK-LABEL: test_lanex_4xi32_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.s, #0, #1 +; CHECK-NEXT: mov w8, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: mov z1.s, w8 +; CHECK-NEXT: mov w8, #5 // =0x5 +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s +; CHECK-NEXT: mov z0.s, p0/m, w8 +; CHECK-NEXT: ret + %b = insertelement poison, i32 5, i32 %x + ret %b +} + +define @test_lanex_2xi64_poison(i64 %e, i32 %x) { +; CHECK-LABEL: test_lanex_2xi64_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov w8, w1 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: mov z1.d, x8 +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: mov z0.d, p0/m, x0 +; CHECK-NEXT: ret + %b = insertelement poison, i64 %e, i32 %x + ret %b +} + +define @test_lanex_2xi64_poison_imm(i32 %x) { +; CHECK-LABEL: test_lanex_2xi64_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov w8, w0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: mov z1.d, x8 +; CHECK-NEXT: mov w8, #5 // =0x5 +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: mov z0.d, p0/m, x8 +; CHECK-NEXT: ret + %b = insertelement poison, i64 5, i32 %x + ret %b +} + +define @test_lanex_nxv2f16_poison(half %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f16_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.d, #0, #1 +; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half %h, i64 %idx + ret %res +} + +define @test_lanex_nxv2f16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f16_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov z1.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: fmov h0, #1.50000000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv4f16_poison(half %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4f16_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.s, #0, #1 +; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half %h, i64 %idx + ret %res +} + +define @test_lanex_nxv4f16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4f16_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.s, #0, #1 +; CHECK-NEXT: mov z1.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s +; CHECK-NEXT: fmov h0, #1.50000000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv8f16_poison(half %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv8f16_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.h, #0, #1 +; CHECK-NEXT: mov z2.h, w0 +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half %h, i64 %idx + ret %res +} + +define @test_lanex_nxv8f16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv8f16_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.h, #0, #1 +; CHECK-NEXT: mov z1.h, w0 +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h +; CHECK-NEXT: fmov h0, #1.50000000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, half 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv2bf16_undef(bfloat %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2bf16_undef: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.d, #0, #1 +; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat %h, i64 %idx + ret %res +} + +define @test_lanex_nxv2bf16_undef_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2bf16_undef_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov z1.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: fmov h0, #1.93750000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv4bf16_undef(bfloat %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4bf16_undef: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.s, #0, #1 +; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat %h, i64 %idx + ret %res +} + +define @test_lanex_nxv4bf16_undef_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4bf16_undef_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.s, #0, #1 +; CHECK-NEXT: mov z1.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s +; CHECK-NEXT: fmov h0, #1.93750000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv8bf16_poison(bfloat %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv8bf16_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.h, #0, #1 +; CHECK-NEXT: mov z2.h, w0 +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat %h, i64 %idx + ret %res +} + +define @test_lanex_nxv8bf16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv8bf16_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.h, #0, #1 +; CHECK-NEXT: mov z1.h, w0 +; CHECK-NEXT: ptrue p0.h +; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h +; CHECK-NEXT: fmov h0, #1.93750000 +; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: ret + %res = insertelement poison, bfloat 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv2f32_poison(float %f, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f32_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.d, #0, #1 +; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d +; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: ret + %res = insertelement poison, float %f, i64 %idx + ret %res +} + +define @test_lanex_nxv2f32_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f32_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov z1.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: fmov s0, #1.50000000 +; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: ret + %res = insertelement poison, float 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv4f32_poison(float %f, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4f32_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.s, #0, #1 +; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s +; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: ret + %res = insertelement poison, float %f, i64 %idx + ret %res +} + +define @test_lanex_nxv4f32_poison_imm(float %f, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4f32_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.s, #0, #1 +; CHECK-NEXT: mov z1.s, w0 +; CHECK-NEXT: ptrue p0.s +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s +; CHECK-NEXT: fmov s0, #1.50000000 +; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: ret + %res = insertelement poison, float 1.5, i64 %idx + ret %res +} + +define @test_lanex_nxv2f64_poison(double %d, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f64_poison: +; CHECK: // %bb.0: +; CHECK-NEXT: index z1.d, #0, #1 +; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d +; CHECK-NEXT: mov z0.d, p0/m, d0 +; CHECK-NEXT: ret + %res = insertelement poison, double %d, i64 %idx + ret %res +} + +define @test_lanex_nxv2f64_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2f64_poison_imm: +; CHECK: // %bb.0: +; CHECK-NEXT: index z0.d, #0, #1 +; CHECK-NEXT: mov z1.d, x0 +; CHECK-NEXT: ptrue p0.d +; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d +; CHECK-NEXT: fmov d0, #1.50000000 +; CHECK-NEXT: mov z0.d, p0/m, d0 +; CHECK-NEXT: ret + %res = insertelement poison, double 1.5, i64 %idx + ret %res +} + +; Redundant lane insert +define @extract_insert_4xi32( %a) { +; CHECK-LABEL: extract_insert_4xi32: +; CHECK: // %bb.0: +; CHECK-NEXT: ret + %b = extractelement %a, i32 2 + %c = insertelement %a, i32 %b, i32 2 + ret %c +} + define @test_lane0_undef_16xi8(i8 %a) { ; CHECK-LABEL: test_lane0_undef_16xi8: ; CHECK: // %bb.0: @@ -326,120 +673,120 @@ define @test_insert_into_undef_nxv2f64(double %a) { } ; Insert scalar at index -define @test_insert_with_index_nxv2f16(half %h, i64 %idx) { +define @test_insert_with_index_nxv2f16( %a, half %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv2f16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: index z2.d, #0, #1 +; CHECK-NEXT: mov z3.d, x0 ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.d, p0/z, z2.d, z3.d +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx + %res = insertelement %a, half %h, i64 %idx ret %res } -define @test_insert_with_index_nxv4f16(half %h, i64 %idx) { +define @test_insert_with_index_nxv4f16( %a, half %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv4f16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: index z2.s, #0, #1 +; CHECK-NEXT: mov z3.s, w0 ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.s, p0/z, z2.s, z3.s +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx + %res = insertelement %a, half %h, i64 %idx ret %res } -define @test_insert_with_index_nxv8f16(half %h, i64 %idx) { +define @test_insert_with_index_nxv8f16( %a, half %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv8f16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.h, #0, #1 -; CHECK-NEXT: mov z2.h, w0 +; CHECK-NEXT: index z2.h, #0, #1 +; CHECK-NEXT: mov z3.h, w0 ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.h, p0/z, z2.h, z3.h +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx + %res = insertelement %a, half %h, i64 %idx ret %res } -define @test_insert_with_index_nxv2bf16(bfloat %h, i64 %idx) { +define @test_insert_with_index_nxv2bf16( %a, bfloat %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv2bf16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: index z2.d, #0, #1 +; CHECK-NEXT: mov z3.d, x0 ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.d, p0/z, z2.d, z3.d +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx + %res = insertelement %a, bfloat %h, i64 %idx ret %res } -define @test_insert_with_index_nxv4bf16(bfloat %h, i64 %idx) { +define @test_insert_with_index_nxv4bf16( %a, bfloat %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv4bf16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: index z2.s, #0, #1 +; CHECK-NEXT: mov z3.s, w0 ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.s, p0/z, z2.s, z3.s +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx + %res = insertelement %a, bfloat %h, i64 %idx ret %res } -define @test_insert_with_index_nxv8bf16(bfloat %h, i64 %idx) { +define @test_insert_with_index_nxv8bf16( %a, bfloat %h, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv8bf16: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.h, #0, #1 -; CHECK-NEXT: mov z2.h, w0 +; CHECK-NEXT: index z2.h, #0, #1 +; CHECK-NEXT: mov z3.h, w0 ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h -; CHECK-NEXT: mov z0.h, p0/m, h0 +; CHECK-NEXT: cmpeq p0.h, p0/z, z2.h, z3.h +; CHECK-NEXT: mov z0.h, p0/m, h1 ; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx + %res = insertelement %a, bfloat %h, i64 %idx ret %res } -define @test_insert_with_index_nxv2f32(float %f, i64 %idx) { +define @test_insert_with_index_nxv2f32( %a, float %f, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv2f32: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: index z2.d, #0, #1 +; CHECK-NEXT: mov z3.d, x0 ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: cmpeq p0.d, p0/z, z2.d, z3.d +; CHECK-NEXT: mov z0.s, p0/m, s1 ; CHECK-NEXT: ret - %res = insertelement poison, float %f, i64 %idx + %res = insertelement %a, float %f, i64 %idx ret %res } -define @test_insert_with_index_nxv4f32(float %f, i64 %idx) { +define @test_insert_with_index_nxv4f32( %a, float %f, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv4f32: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 +; CHECK-NEXT: index z2.s, #0, #1 +; CHECK-NEXT: mov z3.s, w0 ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.s, p0/m, s0 +; CHECK-NEXT: cmpeq p0.s, p0/z, z2.s, z3.s +; CHECK-NEXT: mov z0.s, p0/m, s1 ; CHECK-NEXT: ret - %res = insertelement poison, float %f, i64 %idx + %res = insertelement %a, float %f, i64 %idx ret %res } -define @test_insert_with_index_nxv2f64(double %d, i64 %idx) { +define @test_insert_with_index_nxv2f64( %a, double %d, i64 %idx) { ; CHECK-LABEL: test_insert_with_index_nxv2f64: ; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 +; CHECK-NEXT: index z2.d, #0, #1 +; CHECK-NEXT: mov z3.d, x0 ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.d, p0/m, d0 +; CHECK-NEXT: cmpeq p0.d, p0/z, z2.d, z3.d +; CHECK-NEXT: mov z0.d, p0/m, d1 ; CHECK-NEXT: ret - %res = insertelement poison, double %d, i64 %idx + %res = insertelement %a, double %d, i64 %idx ret %res } From a1cdffd67329f8e577dc3e8b7d401c8aa1590e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Bossu?= Date: Fri, 19 Dec 2025 13:26:17 +0000 Subject: [PATCH 2/3] Rename undef -> poison --- .../test/CodeGen/AArch64/sve-insert-element.ll | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/llvm/test/CodeGen/AArch64/sve-insert-element.ll b/llvm/test/CodeGen/AArch64/sve-insert-element.ll index 5cc54929756ff..2b8d660797493 100644 --- a/llvm/test/CodeGen/AArch64/sve-insert-element.ll +++ b/llvm/test/CodeGen/AArch64/sve-insert-element.ll @@ -166,7 +166,7 @@ define @test_lanex_16xi8( %a, i32 %x) { } ; TODO: Implement DAG combiner. -; INSERT_VECTOR_ELT(undef, ...) -> VECTOR_SPLAT +; INSERT_VECTOR_ELT(poison, ...) -> VECTOR_SPLAT define @test_lanex_16xi8_poison(i8 %e, i32 %x) { ; CHECK-LABEL: test_lanex_16xi8_poison: @@ -365,8 +365,8 @@ define @test_lanex_nxv8f16_poison_imm(i64 %idx) { ret %res } -define @test_lanex_nxv2bf16_undef(bfloat %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2bf16_undef: +define @test_lanex_nxv2bf16_poison(bfloat %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2bf16_poison: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.d, #0, #1 ; CHECK-NEXT: mov z2.d, x0 @@ -378,8 +378,8 @@ define @test_lanex_nxv2bf16_undef(bfloat %h, i64 %idx) { ret %res } -define @test_lanex_nxv2bf16_undef_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2bf16_undef_imm: +define @test_lanex_nxv2bf16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv2bf16_poison_imm: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.d, #0, #1 ; CHECK-NEXT: mov z1.d, x0 @@ -392,8 +392,8 @@ define @test_lanex_nxv2bf16_undef_imm(i64 %idx) { ret %res } -define @test_lanex_nxv4bf16_undef(bfloat %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4bf16_undef: +define @test_lanex_nxv4bf16_poison(bfloat %h, i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4bf16_poison: ; CHECK: // %bb.0: ; CHECK-NEXT: index z1.s, #0, #1 ; CHECK-NEXT: mov z2.s, w0 @@ -405,8 +405,8 @@ define @test_lanex_nxv4bf16_undef(bfloat %h, i64 %idx) { ret %res } -define @test_lanex_nxv4bf16_undef_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4bf16_undef_imm: +define @test_lanex_nxv4bf16_poison_imm(i64 %idx) { +; CHECK-LABEL: test_lanex_nxv4bf16_poison_imm: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #1 ; CHECK-NEXT: mov z1.s, w0 From e4f7614e4e9f32c1a24814ce275cfa14ed0027c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Bossu?= Date: Fri, 19 Dec 2025 15:02:12 +0000 Subject: [PATCH 3/3] Only keep a couple of tests for the DAG combiner. This treats the IR->asm test as a unit test. --- .../CodeGen/AArch64/sve-insert-element.ll | 335 +----------------- 1 file changed, 4 insertions(+), 331 deletions(-) diff --git a/llvm/test/CodeGen/AArch64/sve-insert-element.ll b/llvm/test/CodeGen/AArch64/sve-insert-element.ll index 2b8d660797493..a897850c1365d 100644 --- a/llvm/test/CodeGen/AArch64/sve-insert-element.ll +++ b/llvm/test/CodeGen/AArch64/sve-insert-element.ll @@ -166,7 +166,9 @@ define @test_lanex_16xi8( %a, i32 %x) { } ; TODO: Implement DAG combiner. -; INSERT_VECTOR_ELT(poison, ...) -> VECTOR_SPLAT +; Test the INSERT_VECTOR_ELT(poison, ...) -> VECTOR_SPLAT combiner +; is used as a proxy for testing using IR, but the combiner +; is agnostic of the element type. define @test_lanex_16xi8_poison(i8 %e, i32 %x) { ; CHECK-LABEL: test_lanex_16xi8_poison: @@ -197,336 +199,6 @@ define @test_lanex_16xi8_poison_imm(i8 %e, i32 %x) { ret %b } -define @test_lanex_8xi16_poison(i16 %e, i32 %x) { -; CHECK-LABEL: test_lanex_8xi16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.h, #0, #1 -; CHECK-NEXT: mov w8, w1 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: mov z1.h, w8 -; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h -; CHECK-NEXT: mov z0.h, p0/m, w0 -; CHECK-NEXT: ret - %b = insertelement poison, i16 %e, i32 %x - ret %b -} - -define @test_lanex_8xi16_poison_imm(i32 %x) { -; CHECK-LABEL: test_lanex_8xi16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.h, #0, #1 -; CHECK-NEXT: mov w8, w0 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: mov z1.h, w8 -; CHECK-NEXT: mov w8, #5 // =0x5 -; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h -; CHECK-NEXT: mov z0.h, p0/m, w8 -; CHECK-NEXT: ret - %b = insertelement poison, i16 5, i32 %x - ret %b -} - -define @test_lanex_4xi32_poison(i32 %e, i32 %x) { -; CHECK-LABEL: test_lanex_4xi32_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.s, #0, #1 -; CHECK-NEXT: mov w8, w1 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: mov z1.s, w8 -; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: mov z0.s, p0/m, w0 -; CHECK-NEXT: ret - %b = insertelement poison, i32 %e, i32 %x - ret %b -} - -define @test_lanex_4xi32_poison_imm(i32 %x) { -; CHECK-LABEL: test_lanex_4xi32_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.s, #0, #1 -; CHECK-NEXT: mov w8, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: mov z1.s, w8 -; CHECK-NEXT: mov w8, #5 // =0x5 -; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: mov z0.s, p0/m, w8 -; CHECK-NEXT: ret - %b = insertelement poison, i32 5, i32 %x - ret %b -} - -define @test_lanex_2xi64_poison(i64 %e, i32 %x) { -; CHECK-LABEL: test_lanex_2xi64_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov w8, w1 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: mov z1.d, x8 -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: mov z0.d, p0/m, x0 -; CHECK-NEXT: ret - %b = insertelement poison, i64 %e, i32 %x - ret %b -} - -define @test_lanex_2xi64_poison_imm(i32 %x) { -; CHECK-LABEL: test_lanex_2xi64_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov w8, w0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: mov z1.d, x8 -; CHECK-NEXT: mov w8, #5 // =0x5 -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: mov z0.d, p0/m, x8 -; CHECK-NEXT: ret - %b = insertelement poison, i64 5, i32 %x - ret %b -} - -define @test_lanex_nxv2f16_poison(half %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx - ret %res -} - -define @test_lanex_nxv2f16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov z1.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: fmov h0, #1.50000000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv4f16_poison(half %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4f16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx - ret %res -} - -define @test_lanex_nxv4f16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4f16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.s, #0, #1 -; CHECK-NEXT: mov z1.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: fmov h0, #1.50000000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv8f16_poison(half %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv8f16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.h, #0, #1 -; CHECK-NEXT: mov z2.h, w0 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half %h, i64 %idx - ret %res -} - -define @test_lanex_nxv8f16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv8f16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.h, #0, #1 -; CHECK-NEXT: mov z1.h, w0 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h -; CHECK-NEXT: fmov h0, #1.50000000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, half 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv2bf16_poison(bfloat %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2bf16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx - ret %res -} - -define @test_lanex_nxv2bf16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2bf16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov z1.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: fmov h0, #1.93750000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv4bf16_poison(bfloat %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4bf16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx - ret %res -} - -define @test_lanex_nxv4bf16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4bf16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.s, #0, #1 -; CHECK-NEXT: mov z1.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: fmov h0, #1.93750000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv8bf16_poison(bfloat %h, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv8bf16_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.h, #0, #1 -; CHECK-NEXT: mov z2.h, w0 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat %h, i64 %idx - ret %res -} - -define @test_lanex_nxv8bf16_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv8bf16_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.h, #0, #1 -; CHECK-NEXT: mov z1.h, w0 -; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h -; CHECK-NEXT: fmov h0, #1.93750000 -; CHECK-NEXT: mov z0.h, p0/m, h0 -; CHECK-NEXT: ret - %res = insertelement poison, bfloat 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv2f32_poison(float %f, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f32_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.s, p0/m, s0 -; CHECK-NEXT: ret - %res = insertelement poison, float %f, i64 %idx - ret %res -} - -define @test_lanex_nxv2f32_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f32_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov z1.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: fmov s0, #1.50000000 -; CHECK-NEXT: mov z0.s, p0/m, s0 -; CHECK-NEXT: ret - %res = insertelement poison, float 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv4f32_poison(float %f, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4f32_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.s, #0, #1 -; CHECK-NEXT: mov z2.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s -; CHECK-NEXT: mov z0.s, p0/m, s0 -; CHECK-NEXT: ret - %res = insertelement poison, float %f, i64 %idx - ret %res -} - -define @test_lanex_nxv4f32_poison_imm(float %f, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv4f32_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.s, #0, #1 -; CHECK-NEXT: mov z1.s, w0 -; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: fmov s0, #1.50000000 -; CHECK-NEXT: mov z0.s, p0/m, s0 -; CHECK-NEXT: ret - %res = insertelement poison, float 1.5, i64 %idx - ret %res -} - -define @test_lanex_nxv2f64_poison(double %d, i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f64_poison: -; CHECK: // %bb.0: -; CHECK-NEXT: index z1.d, #0, #1 -; CHECK-NEXT: mov z2.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d -; CHECK-NEXT: mov z0.d, p0/m, d0 -; CHECK-NEXT: ret - %res = insertelement poison, double %d, i64 %idx - ret %res -} - -define @test_lanex_nxv2f64_poison_imm(i64 %idx) { -; CHECK-LABEL: test_lanex_nxv2f64_poison_imm: -; CHECK: // %bb.0: -; CHECK-NEXT: index z0.d, #0, #1 -; CHECK-NEXT: mov z1.d, x0 -; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: cmpeq p0.d, p0/z, z0.d, z1.d -; CHECK-NEXT: fmov d0, #1.50000000 -; CHECK-NEXT: mov z0.d, p0/m, d0 -; CHECK-NEXT: ret - %res = insertelement poison, double 1.5, i64 %idx - ret %res -} - ; Redundant lane insert define @extract_insert_4xi32( %a) { ; CHECK-LABEL: extract_insert_4xi32: @@ -537,6 +209,7 @@ define @extract_insert_4xi32( %a) { ret %c } +; Inserting lane 0 into poison uses fmov instead of broadcasting to all lanes define @test_lane0_undef_16xi8(i8 %a) { ; CHECK-LABEL: test_lane0_undef_16xi8: ; CHECK: // %bb.0: