From ba2db8166775acc0187cc33f2cae6f73e86ae1cd Mon Sep 17 00:00:00 2001 From: Bjorn Pettersson Date: Tue, 3 Jun 2025 11:36:26 +0200 Subject: [PATCH] [test][AArch64] Adjust vector insertion lit tests The test cases test_insert_v16i8_insert_2_undef_base and test_insert_v16i8_insert_2_undef_base_different_valeus in CodeGen/AArch64/arm64-vector-insertion.ll was leaving element 8 in the vector as "undef" without any real explanation. It kind of looked like a typo as the input IR looked like this %v.8 = insertelement <16 x i8> %v.7, i8 %a, i32 8 %v.10 = insertelement <16 x i8> %v.7, i8 %a, i32 10 leaving %v.8 as unused. This patch is cleaning up the tests a bit by adding separate test cases to validate what is happening when skipping insert at index 8, while amending the original tests cases to use %v.8 instead of %v.7 when creating %v.10. --- .../CodeGen/AArch64/arm64-vector-insertion.ll | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/llvm/test/CodeGen/AArch64/arm64-vector-insertion.ll b/llvm/test/CodeGen/AArch64/arm64-vector-insertion.ll index 94074d1689f6a..ff28c7817d143 100644 --- a/llvm/test/CodeGen/AArch64/arm64-vector-insertion.ll +++ b/llvm/test/CodeGen/AArch64/arm64-vector-insertion.ll @@ -66,6 +66,35 @@ define <16 x i8> @test_insert_v16i8_insert_2_undef_base(i8 %a) { %v.6 = insertelement <16 x i8> %v.4, i8 %a, i32 6 %v.7 = insertelement <16 x i8> %v.6, i8 %a, i32 7 %v.8 = insertelement <16 x i8> %v.7, i8 %a, i32 8 + %v.10 = insertelement <16 x i8> %v.8, i8 %a, i32 10 + %v.11 = insertelement <16 x i8> %v.10, i8 %a, i32 11 + %v.12 = insertelement <16 x i8> %v.11, i8 %a, i32 12 + %v.13 = insertelement <16 x i8> %v.12, i8 %a, i32 13 + %v.14 = insertelement <16 x i8> %v.13, i8 %a, i32 14 + %v.15 = insertelement <16 x i8> %v.14, i8 %a, i32 15 + ret <16 x i8> %v.15 +} + +; Similar to above, but we leave element 8 as undef. One interesting part with +; this test case is that %a may be poison, so simply inserting %a also at +; index 8 would make the result vector more poisonous. +define <16 x i8> @test_insert_v16i8_insert_2_undef_base_skip8(i32 %a0) { +; CHECK-LABEL: test_insert_v16i8_insert_2_undef_base_skip8: +; CHECK: // %bb.0: +; CHECK-NEXT: lsr w8, w0, #5 +; CHECK-NEXT: dup.16b v0, w8 +; CHECK-NEXT: mov.b v0[5], wzr +; CHECK-NEXT: mov.b v0[9], wzr +; CHECK-NEXT: ret + %a1 = lshr exact i32 %a0, 5 + %a = trunc i32 %a1 to i8 + %v.0 = insertelement <16 x i8> , i8 %a, i32 0 + %v.1 = insertelement <16 x i8> %v.0, i8 %a, i32 1 + %v.2 = insertelement <16 x i8> %v.1, i8 %a, i32 2 + %v.3 = insertelement <16 x i8> %v.2, i8 %a, i32 3 + %v.4 = insertelement <16 x i8> %v.3, i8 %a, i32 4 + %v.6 = insertelement <16 x i8> %v.4, i8 %a, i32 6 + %v.7 = insertelement <16 x i8> %v.6, i8 %a, i32 7 %v.10 = insertelement <16 x i8> %v.7, i8 %a, i32 10 %v.11 = insertelement <16 x i8> %v.10, i8 %a, i32 11 %v.12 = insertelement <16 x i8> %v.11, i8 %a, i32 12 @@ -75,8 +104,8 @@ define <16 x i8> @test_insert_v16i8_insert_2_undef_base(i8 %a) { ret <16 x i8> %v.15 } -define <16 x i8> @test_insert_v16i8_insert_2_undef_base_different_valeus(i8 %a, i8 %b) { -; CHECK-LABEL: test_insert_v16i8_insert_2_undef_base_different_valeus: +define <16 x i8> @test_insert_v16i8_insert_2_undef_base_different_values(i8 %a, i8 %b) { +; CHECK-LABEL: test_insert_v16i8_insert_2_undef_base_different_values: ; CHECK: // %bb.0: ; CHECK-NEXT: dup.16b v0, w0 ; CHECK-NEXT: mov.b v0[2], w1 @@ -94,6 +123,42 @@ define <16 x i8> @test_insert_v16i8_insert_2_undef_base_different_valeus(i8 %a, %v.6 = insertelement <16 x i8> %v.4, i8 %a, i32 6 %v.7 = insertelement <16 x i8> %v.6, i8 %b, i32 7 %v.8 = insertelement <16 x i8> %v.7, i8 %a, i32 8 + %v.10 = insertelement <16 x i8> %v.8, i8 %a, i32 10 + %v.11 = insertelement <16 x i8> %v.10, i8 %a, i32 11 + %v.12 = insertelement <16 x i8> %v.11, i8 %b, i32 12 + %v.13 = insertelement <16 x i8> %v.12, i8 %a, i32 13 + %v.14 = insertelement <16 x i8> %v.13, i8 %a, i32 14 + %v.15 = insertelement <16 x i8> %v.14, i8 %b, i32 15 + ret <16 x i8> %v.15 +} + +; Similar to above, but we leave element 8 as undef. One interesting part with +; this test case is that %a and %b may be poison, so simply inserting %a or %b +; at index 8 would make the result vector more poisonous. +define <16 x i8> @test_insert_v16i8_insert_2_undef_base_different_values_skip8(i32 %a0, i32 %b0) { +; CHECK-LABEL: test_insert_v16i8_insert_2_undef_base_different_values_skip8: +; CHECK: // %bb.0: +; CHECK-NEXT: lsr w8, w0, #5 +; CHECK-NEXT: dup.16b v0, w8 +; CHECK-NEXT: lsr w8, w1, #5 +; CHECK-NEXT: mov.b v0[2], w8 +; CHECK-NEXT: mov.b v0[5], wzr +; CHECK-NEXT: mov.b v0[7], w8 +; CHECK-NEXT: mov.b v0[9], wzr +; CHECK-NEXT: mov.b v0[12], w8 +; CHECK-NEXT: mov.b v0[15], w8 +; CHECK-NEXT: ret + %a1 = lshr exact i32 %a0, 5 + %a = trunc i32 %a1 to i8 + %b1 = lshr exact i32 %b0, 5 + %b = trunc i32 %b1 to i8 + %v.0 = insertelement <16 x i8> , i8 %a, i32 0 + %v.1 = insertelement <16 x i8> %v.0, i8 %a, i32 1 + %v.2 = insertelement <16 x i8> %v.1, i8 %b, i32 2 + %v.3 = insertelement <16 x i8> %v.2, i8 %a, i32 3 + %v.4 = insertelement <16 x i8> %v.3, i8 %a, i32 4 + %v.6 = insertelement <16 x i8> %v.4, i8 %a, i32 6 + %v.7 = insertelement <16 x i8> %v.6, i8 %b, i32 7 %v.10 = insertelement <16 x i8> %v.7, i8 %a, i32 10 %v.11 = insertelement <16 x i8> %v.10, i8 %a, i32 11 %v.12 = insertelement <16 x i8> %v.11, i8 %b, i32 12