From 6edcb52f4031a50608645d9f65061e61a1b7fb8d Mon Sep 17 00:00:00 2001 From: Paul Walker Date: Mon, 28 Apr 2025 18:25:36 +0100 Subject: [PATCH] [NFC][InstCombine][AArch64] Remove SVE mul idempotency tests. They have been subsumed into the SVE binop simplification tests. --- .../AArch64/sve-intrinsic-fmul-idempotency.ll | 130 ------------------ .../sve-intrinsic-fmul_u-idempotency.ll | 129 ----------------- .../AArch64/sve-intrinsic-mul-idempotency.ll | 130 ------------------ .../sve-intrinsic-mul_u-idempotency.ll | 129 ----------------- 4 files changed, 518 deletions(-) delete mode 100644 llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul-idempotency.ll delete mode 100644 llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul_u-idempotency.ll delete mode 100644 llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul-idempotency.ll delete mode 100644 llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul_u-idempotency.ll diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul-idempotency.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul-idempotency.ll deleted file mode 100644 index 3b37e2c1fdde..000000000000 --- a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul-idempotency.ll +++ /dev/null @@ -1,130 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -S -passes=instcombine < %s | FileCheck %s - -target triple = "aarch64-unknown-linux-gnu" - -; Idempotent fmuls -- should compile to just a ret. -define @idempotent_fmul_f16( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_f16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %2 = call @llvm.aarch64.sve.fmul.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_f32( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_f32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4f32(float 1.0) - %2 = call @llvm.aarch64.sve.fmul.nxv4f32( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_f64( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_f64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 1.0) - %2 = call @llvm.aarch64.sve.fmul.nxv2f64( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_different_argument_order( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_different_argument_order( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = select [[PG]], [[A]], splat (double 1.000000e+00) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 1.0) - ; Different argument order to the above tests. - %2 = call @llvm.aarch64.sve.fmul.nxv2f64( %pg, %1, %a) - ret %2 -} - -define @idempotent_fmul_with_predicated_dup( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_with_predicated_dup( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.nxv8f16( poison, %pg, half 1.0) - %2 = call @llvm.aarch64.sve.fmul.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_two_dups( %pg, %a) #0 { - ; Edge case -- make sure that the case where we're fmultiplying two dups - ; together is sane. -; CHECK-LABEL: define @idempotent_fmul_two_dups( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret splat (half 0xH3C00) -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %2 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %3 = call @llvm.aarch64.sve.fmul.nxv8f16( %pg, %1, %2) - ret %3 -} - -; Non-idempotent fmuls -- we don't expect these to be optimised out. -define @non_idempotent_fmul_f16( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_f16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.nxv8f16( [[PG]], [[A]], splat (half 0xH4000)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 2.0) - %2 = call @llvm.aarch64.sve.fmul.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_f32( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_f32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.nxv4f32( [[PG]], [[A]], splat (float 2.000000e+00)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4f32(float 2.0) - %2 = call @llvm.aarch64.sve.fmul.nxv4f32( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_f64( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_f64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.nxv2f64( [[PG]], [[A]], splat (double 2.000000e+00)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 2.0) - %2 = call @llvm.aarch64.sve.fmul.nxv2f64( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_with_predicated_dup( %pg1, %pg2, %a) #0 { - ; Different predicates -; CHECK-LABEL: define @non_idempotent_fmul_with_predicated_dup( -; CHECK-SAME: [[PG1:%.*]], [[PG2:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.dup.nxv2f64( poison, [[PG1]], double 1.000000e+00) -; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.fmul.nxv2f64( [[PG2]], [[A]], [[TMP1]]) -; CHECK-NEXT: ret [[TMP2]] -; - %1 = call @llvm.aarch64.sve.dup.nxv2f64( poison, %pg1, double 1.0) - %2 = call @llvm.aarch64.sve.fmul.nxv2f64( %pg2, %a, %1) - ret %2 -} - -declare @llvm.aarch64.sve.dup.x.nxv8f16(half) -declare @llvm.aarch64.sve.dup.x.nxv4f32(float) -declare @llvm.aarch64.sve.dup.x.nxv2f64(double) - -declare @llvm.aarch64.sve.dup.nxv2f64(, , double) -declare @llvm.aarch64.sve.dup.nxv8f16(, , half) - -declare @llvm.aarch64.sve.fmul.nxv8f16(, , ) -declare @llvm.aarch64.sve.fmul.nxv4f32(, , ) -declare @llvm.aarch64.sve.fmul.nxv2f64(, , ) - -attributes #0 = { "target-features"="+sve" } diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul_u-idempotency.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul_u-idempotency.ll deleted file mode 100644 index 38ed4272d826..000000000000 --- a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-fmul_u-idempotency.ll +++ /dev/null @@ -1,129 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -S -passes=instcombine < %s | FileCheck %s - -target triple = "aarch64-unknown-linux-gnu" - -; Idempotent fmuls_u -- should compile to just a ret. -define @idempotent_fmul_u_f16( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_u_f16( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_u_f32( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_u_f32( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4f32(float 1.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv4f32( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_u_f64( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_u_f64( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 1.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv2f64( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_u_different_argument_order( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_u_different_argument_order( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 1.0) - ; Different argument order to the above tests. - %2 = call @llvm.aarch64.sve.fmul.u.nxv2f64( %pg, %1, %a) - ret %2 -} - -define @idempotent_fmul_u_with_predicated_dup( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_fmul_u_with_predicated_dup( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.nxv8f16( poison, %pg, half 1.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @idempotent_fmul_u_two_dups( %pg, %a) #0 { - ; Edge case -- make sure that the case where we're fmultiplying two dups - ; together is sane. -; CHECK-LABEL: define @idempotent_fmul_u_two_dups( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret splat (half 0xH3C00) -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %2 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 1.0) - %3 = call @llvm.aarch64.sve.fmul.u.nxv8f16( %pg, %1, %2) - ret %3 -} - -; Non-idempotent fmuls_u -- we don't expect these to be optimised out. -define @non_idempotent_fmul_u_f16( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_u_f16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.u.nxv8f16( [[PG]], [[A]], splat (half 0xH4000)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8f16(half 2.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv8f16( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_u_f32( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_u_f32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.u.nxv4f32( [[PG]], [[A]], splat (float 2.000000e+00)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4f32(float 2.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv4f32( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_u_f64( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_fmul_u_f64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.fmul.u.nxv2f64( [[PG]], [[A]], splat (double 2.000000e+00)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2f64(double 2.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv2f64( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_fmul_u_with_predicated_dup( %pg1, %pg2, %a) #0 { - ; Different predicates -; CHECK-LABEL: define @non_idempotent_fmul_u_with_predicated_dup( -; CHECK-SAME: [[PG1:%.*]], [[PG2:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.dup.nxv2f64( poison, [[PG1]], double 1.000000e+00) -; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.fmul.u.nxv2f64( [[PG2]], [[A]], [[TMP1]]) -; CHECK-NEXT: ret [[TMP2]] -; - %1 = call @llvm.aarch64.sve.dup.nxv2f64( poison, %pg1, double 1.0) - %2 = call @llvm.aarch64.sve.fmul.u.nxv2f64( %pg2, %a, %1) - ret %2 -} - -declare @llvm.aarch64.sve.dup.x.nxv8f16(half) -declare @llvm.aarch64.sve.dup.x.nxv4f32(float) -declare @llvm.aarch64.sve.dup.x.nxv2f64(double) - -declare @llvm.aarch64.sve.dup.nxv2f64(, , double) -declare @llvm.aarch64.sve.dup.nxv8f16(, , half) - -declare @llvm.aarch64.sve.fmul.u.nxv8f16(, , ) -declare @llvm.aarch64.sve.fmul.u.nxv4f32(, , ) -declare @llvm.aarch64.sve.fmul.u.nxv2f64(, , ) - -attributes #0 = { "target-features"="+sve" } diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul-idempotency.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul-idempotency.ll deleted file mode 100644 index 602db4eb1d42..000000000000 --- a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul-idempotency.ll +++ /dev/null @@ -1,130 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -S -passes=instcombine < %s | FileCheck %s - -target triple = "aarch64-unknown-linux-gnu" - -; Idempotent muls -- should compile to just a ret. -define @idempotent_mul_i16( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_i16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %2 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_i32( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_i32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 1) - %2 = call @llvm.aarch64.sve.mul.nxv4i32( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_i64( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_i64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) - %2 = call @llvm.aarch64.sve.mul.nxv2i64( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_different_argument_order( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_different_argument_order( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = select [[PG]], [[A]], splat (i64 1) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) - ; Different argument order to the above tests. - %2 = call @llvm.aarch64.sve.mul.nxv2i64( %pg, %1, %a) - ret %2 -} - -define @idempotent_mul_with_predicated_dup( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_with_predicated_dup( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[A]] -; - %1 = call @llvm.aarch64.sve.dup.nxv8i16( poison, %pg, i16 1) - %2 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_two_dups( %pg, %a) #0 { - ; Edge case -- make sure that the case where we're multiplying two dups - ; together is sane. -; CHECK-LABEL: define @idempotent_mul_two_dups( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret splat (i16 1) -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %2 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %3 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, %1, %2) - ret %3 -} - -; Non-idempotent muls -- we don't expect these to be optimised out. -define @non_idempotent_mul_i16( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_i16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.nxv8i16( [[PG]], [[A]], splat (i16 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 2) - %2 = call @llvm.aarch64.sve.mul.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_i32( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_i32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.nxv4i32( [[PG]], [[A]], splat (i32 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 2) - %2 = call @llvm.aarch64.sve.mul.nxv4i32( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_i64( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_i64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.nxv2i64( [[PG]], [[A]], splat (i64 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 2) - %2 = call @llvm.aarch64.sve.mul.nxv2i64( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_with_predicated_dup( %pg1, %pg2, %a) #0 { - ; Different predicates -; CHECK-LABEL: define @non_idempotent_mul_with_predicated_dup( -; CHECK-SAME: [[PG1:%.*]], [[PG2:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.dup.nxv2i64( poison, [[PG1]], i64 1) -; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.mul.nxv2i64( [[PG2]], [[A]], [[TMP1]]) -; CHECK-NEXT: ret [[TMP2]] -; - %1 = call @llvm.aarch64.sve.dup.nxv2i64( poison, %pg1, i64 1) - %2 = call @llvm.aarch64.sve.mul.nxv2i64( %pg2, %a, %1) - ret %2 -} - -declare @llvm.aarch64.sve.dup.x.nxv8i16(i16) -declare @llvm.aarch64.sve.dup.x.nxv4i32(i32) -declare @llvm.aarch64.sve.dup.x.nxv2i64(i64) - -declare @llvm.aarch64.sve.dup.nxv2i64(, , i64) -declare @llvm.aarch64.sve.dup.nxv8i16(, , i16) - -declare @llvm.aarch64.sve.mul.nxv8i16(, , ) -declare @llvm.aarch64.sve.mul.nxv4i32(, , ) -declare @llvm.aarch64.sve.mul.nxv2i64(, , ) - -attributes #0 = { "target-features"="+sve" } diff --git a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul_u-idempotency.ll b/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul_u-idempotency.ll deleted file mode 100644 index e899c787aa55..000000000000 --- a/llvm/test/Transforms/InstCombine/AArch64/sve-intrinsic-mul_u-idempotency.ll +++ /dev/null @@ -1,129 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 -; RUN: opt -S -passes=instcombine < %s | FileCheck %s - -target triple = "aarch64-unknown-linux-gnu" - -; Idempotent muls -- should compile to just a ret. -define @idempotent_mul_u_i16( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_u_i16( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %2 = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_u_i32( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_u_i32( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 1) - %2 = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_u_i64( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_u_i64( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) - %2 = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_u_different_argument_order( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_u_different_argument_order( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 1) - ; Different argument order to the above tests. - %2 = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %1, %a) - ret %2 -} - -define @idempotent_mul_u_with_predicated_dup( %pg, %a) #0 { -; CHECK-LABEL: define @idempotent_mul_u_with_predicated_dup( -; CHECK-SAME: [[PG:%.*]], [[TMP0:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret [[TMP0]] -; - %1 = call @llvm.aarch64.sve.dup.nxv8i16( poison, %pg, i16 1) - %2 = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @idempotent_mul_u_two_dups( %pg, %a) #0 { - ; Edge case -- make sure that the case where we're multiplying two dups - ; together is sane. -; CHECK-LABEL: define @idempotent_mul_u_two_dups( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: ret splat (i16 1) -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %2 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 1) - %3 = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %1, %2) - ret %3 -} - -; Non-idempotent muls -- we don't expect these to be optimised out. -define @non_idempotent_mul_u_i16( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_u_i16( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.u.nxv8i16( [[PG]], [[A]], splat (i16 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv8i16(i16 2) - %2 = call @llvm.aarch64.sve.mul.u.nxv8i16( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_u_i32( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_u_i32( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.u.nxv4i32( [[PG]], [[A]], splat (i32 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv4i32(i32 2) - %2 = call @llvm.aarch64.sve.mul.u.nxv4i32( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_u_i64( %pg, %a) #0 { -; CHECK-LABEL: define @non_idempotent_mul_u_i64( -; CHECK-SAME: [[PG:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.mul.u.nxv2i64( [[PG]], [[A]], splat (i64 2)) -; CHECK-NEXT: ret [[TMP1]] -; - %1 = call @llvm.aarch64.sve.dup.x.nxv2i64(i64 2) - %2 = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg, %a, %1) - ret %2 -} - -define @non_idempotent_mul_u_with_predicated_dup( %pg1, %pg2, %a) #0 { - ; Different predicates -; CHECK-LABEL: define @non_idempotent_mul_u_with_predicated_dup( -; CHECK-SAME: [[PG1:%.*]], [[PG2:%.*]], [[A:%.*]]) #[[ATTR0]] { -; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.aarch64.sve.dup.nxv2i64( poison, [[PG1]], i64 1) -; CHECK-NEXT: [[TMP2:%.*]] = call @llvm.aarch64.sve.mul.u.nxv2i64( [[PG2]], [[A]], [[TMP1]]) -; CHECK-NEXT: ret [[TMP2]] -; - %1 = call @llvm.aarch64.sve.dup.nxv2i64( poison, %pg1, i64 1) - %2 = call @llvm.aarch64.sve.mul.u.nxv2i64( %pg2, %a, %1) - ret %2 -} - -declare @llvm.aarch64.sve.dup.x.nxv8i16(i16) -declare @llvm.aarch64.sve.dup.x.nxv4i32(i32) -declare @llvm.aarch64.sve.dup.x.nxv2i64(i64) - -declare @llvm.aarch64.sve.dup.nxv2i64(, , i64) -declare @llvm.aarch64.sve.dup.nxv8i16(, , i16) - -declare @llvm.aarch64.sve.mul.u.nxv8i16(, , ) -declare @llvm.aarch64.sve.mul.u.nxv4i32(, , ) -declare @llvm.aarch64.sve.mul.u.nxv2i64(, , ) - -attributes #0 = { "target-features"="+sve" }