llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-ir Author: Ömer Sinan Ağacan (osa1) <details> <summary>Changes</summary> --- Patch is 100.68 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/225339.diff 5 Files Affected: - (modified) clang/test/CodeGen/AArch64/neon/intrinsics.c (+24-24) - (modified) llvm/lib/IR/AutoUpgrade.cpp (+16) - (added) llvm/test/Bitcode/aarch64-neon-minmax-upgrade.ll (+59) - (modified) llvm/test/CodeGen/AArch64/abd-combine.ll (+3-4) - (modified) llvm/test/Instrumentation/MemorySanitizer/AArch64/arm64-vmax.ll (+156-156) ``````````diff diff --git a/clang/test/CodeGen/AArch64/neon/intrinsics.c b/clang/test/CodeGen/AArch64/neon/intrinsics.c index 7175c616cf484..a804f0bc218ad 100644 --- a/clang/test/CodeGen/AArch64/neon/intrinsics.c +++ b/clang/test/CodeGen/AArch64/neon/intrinsics.c @@ -2321,7 +2321,7 @@ int8x8_t test_vmax_s8(int8x8_t v1, int8x8_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.smax" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s8i>, !cir.vector<8 x !s8i>) -> !cir.vector<8 x !s8i> // LLVM-SAME: <8 x i8> {{.*}} [[V1:%.*]], <8 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMAX_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.smax.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) + // LLVM: [[VMAX_V_I:%.*]] = call <8 x i8> @llvm.smax.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) // LLVM: ret <8 x i8> [[VMAX_V_I]] return vmax_s8(v1, v2); } @@ -2336,7 +2336,7 @@ int16x4_t test_vmax_s16(int16x4_t v1, int16x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i16> [[V2]] to <8 x i8> // LLVM: [[VMAX_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> // LLVM: [[VMAX_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> - // LLVM: [[VMAX_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.smax.v4i16(<4 x i16> [[VMAX_V_I]], <4 x i16> [[VMAX_V1_I]]) + // LLVM: [[VMAX_V2_I:%.*]] = call <4 x i16> @llvm.smax.v4i16(<4 x i16> [[VMAX_V_I]], <4 x i16> [[VMAX_V1_I]]) // LLVM: ret <4 x i16> [[VMAX_V2_I]] return vmax_s16(v1, v2); } @@ -2351,7 +2351,7 @@ int32x2_t test_vmax_s32(int32x2_t v1, int32x2_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <2 x i32> [[V2]] to <8 x i8> // LLVM: [[VMAX_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> // LLVM: [[VMAX_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32> - // LLVM: [[VMAX_V2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.smax.v2i32(<2 x i32> [[VMAX_V_I]], <2 x i32> [[VMAX_V1_I]]) + // LLVM: [[VMAX_V2_I:%.*]] = call <2 x i32> @llvm.smax.v2i32(<2 x i32> [[VMAX_V_I]], <2 x i32> [[VMAX_V1_I]]) // LLVM: ret <2 x i32> [[VMAX_V2_I]] return vmax_s32(v1, v2); } @@ -2362,7 +2362,7 @@ uint8x8_t test_vmax_u8(uint8x8_t v1, uint8x8_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.umax" %{{.*}}, %{{.*}} : (!cir.vector<8 x !u8i>, !cir.vector<8 x !u8i>) -> !cir.vector<8 x !u8i> // LLVM-SAME: <8 x i8> {{.*}} [[V1:%.*]], <8 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMAX_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.umax.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) + // LLVM: [[VMAX_V_I:%.*]] = call <8 x i8> @llvm.umax.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) // LLVM: ret <8 x i8> [[VMAX_V_I]] return vmax_u8(v1, v2); } @@ -2377,7 +2377,7 @@ uint16x4_t test_vmax_u16(uint16x4_t v1, uint16x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i16> [[V2]] to <8 x i8> // LLVM: [[VMAX_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> // LLVM: [[VMAX_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> - // LLVM: [[VMAX_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.umax.v4i16(<4 x i16> [[VMAX_V_I]], <4 x i16> [[VMAX_V1_I]]) + // LLVM: [[VMAX_V2_I:%.*]] = call <4 x i16> @llvm.umax.v4i16(<4 x i16> [[VMAX_V_I]], <4 x i16> [[VMAX_V1_I]]) // LLVM: ret <4 x i16> [[VMAX_V2_I]] return vmax_u16(v1, v2); } @@ -2392,7 +2392,7 @@ uint32x2_t test_vmax_u32(uint32x2_t v1, uint32x2_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <2 x i32> [[V2]] to <8 x i8> // LLVM: [[VMAX_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> // LLVM: [[VMAX_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32> - // LLVM: [[VMAX_V2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.umax.v2i32(<2 x i32> [[VMAX_V_I]], <2 x i32> [[VMAX_V1_I]]) + // LLVM: [[VMAX_V2_I:%.*]] = call <2 x i32> @llvm.umax.v2i32(<2 x i32> [[VMAX_V_I]], <2 x i32> [[VMAX_V1_I]]) // LLVM: ret <2 x i32> [[VMAX_V2_I]] return vmax_u32(v1, v2); } @@ -2403,7 +2403,7 @@ int8x16_t test_vmaxq_s8(int8x16_t v1, int8x16_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.smax" %{{.*}}, %{{.*}} : (!cir.vector<16 x !s8i>, !cir.vector<16 x !s8i>) -> !cir.vector<16 x !s8i> // LLVM-SAME: <16 x i8> {{.*}} [[V1:%.*]], <16 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMAXQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.smax.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) + // LLVM: [[VMAXQ_V_I:%.*]] = call <16 x i8> @llvm.smax.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) // LLVM: ret <16 x i8> [[VMAXQ_V_I]] return vmaxq_s8(v1, v2); } @@ -2418,7 +2418,7 @@ int16x8_t test_vmaxq_s16(int16x8_t v1, int16x8_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <8 x i16> [[V2]] to <16 x i8> // LLVM: [[VMAXQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> // LLVM: [[VMAXQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> - // LLVM: [[VMAXQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.smax.v8i16(<8 x i16> [[VMAXQ_V_I]], <8 x i16> [[VMAXQ_V1_I]]) + // LLVM: [[VMAXQ_V2_I:%.*]] = call <8 x i16> @llvm.smax.v8i16(<8 x i16> [[VMAXQ_V_I]], <8 x i16> [[VMAXQ_V1_I]]) // LLVM: ret <8 x i16> [[VMAXQ_V2_I]] return vmaxq_s16(v1, v2); } @@ -2433,7 +2433,7 @@ int32x4_t test_vmaxq_s32(int32x4_t v1, int32x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i32> [[V2]] to <16 x i8> // LLVM: [[VMAXQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // LLVM: [[VMAXQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32> - // LLVM: [[VMAXQ_V2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.smax.v4i32(<4 x i32> [[VMAXQ_V_I]], <4 x i32> [[VMAXQ_V1_I]]) + // LLVM: [[VMAXQ_V2_I:%.*]] = call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[VMAXQ_V_I]], <4 x i32> [[VMAXQ_V1_I]]) // LLVM: ret <4 x i32> [[VMAXQ_V2_I]] return vmaxq_s32(v1, v2); } @@ -2444,7 +2444,7 @@ uint8x16_t test_vmaxq_u8(uint8x16_t v1, uint8x16_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.umax" %{{.*}}, %{{.*}} : (!cir.vector<16 x !u8i>, !cir.vector<16 x !u8i>) -> !cir.vector<16 x !u8i> // LLVM-SAME: <16 x i8> {{.*}} [[V1:%.*]], <16 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMAXQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.umax.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) + // LLVM: [[VMAXQ_V_I:%.*]] = call <16 x i8> @llvm.umax.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) // LLVM: ret <16 x i8> [[VMAXQ_V_I]] return vmaxq_u8(v1, v2); } @@ -2459,7 +2459,7 @@ uint16x8_t test_vmaxq_u16(uint16x8_t v1, uint16x8_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <8 x i16> [[V2]] to <16 x i8> // LLVM: [[VMAXQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> // LLVM: [[VMAXQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> - // LLVM: [[VMAXQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.umax.v8i16(<8 x i16> [[VMAXQ_V_I]], <8 x i16> [[VMAXQ_V1_I]]) + // LLVM: [[VMAXQ_V2_I:%.*]] = call <8 x i16> @llvm.umax.v8i16(<8 x i16> [[VMAXQ_V_I]], <8 x i16> [[VMAXQ_V1_I]]) // LLVM: ret <8 x i16> [[VMAXQ_V2_I]] return vmaxq_u16(v1, v2); } @@ -2474,7 +2474,7 @@ uint32x4_t test_vmaxq_u32(uint32x4_t v1, uint32x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i32> [[V2]] to <16 x i8> // LLVM: [[VMAXQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // LLVM: [[VMAXQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32> - // LLVM: [[VMAXQ_V2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.umax.v4i32(<4 x i32> [[VMAXQ_V_I]], <4 x i32> [[VMAXQ_V1_I]]) + // LLVM: [[VMAXQ_V2_I:%.*]] = call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[VMAXQ_V_I]], <4 x i32> [[VMAXQ_V1_I]]) // LLVM: ret <4 x i32> [[VMAXQ_V2_I]] return vmaxq_u32(v1, v2); } @@ -2920,7 +2920,7 @@ int8x8_t test_vmin_s8(int8x8_t v1, int8x8_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.smin" %{{.*}}, %{{.*}} : (!cir.vector<8 x !s8i>, !cir.vector<8 x !s8i>) -> !cir.vector<8 x !s8i> // LLVM-SAME: <8 x i8> {{.*}} [[V1:%.*]], <8 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMIN_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.smin.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) + // LLVM: [[VMIN_V_I:%.*]] = call <8 x i8> @llvm.smin.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) // LLVM: ret <8 x i8> [[VMIN_V_I]] return vmin_s8(v1, v2); } @@ -2935,7 +2935,7 @@ int16x4_t test_vmin_s16(int16x4_t v1, int16x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i16> [[V2]] to <8 x i8> // LLVM: [[VMIN_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> // LLVM: [[VMIN_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> - // LLVM: [[VMIN_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.smin.v4i16(<4 x i16> [[VMIN_V_I]], <4 x i16> [[VMIN_V1_I]]) + // LLVM: [[VMIN_V2_I:%.*]] = call <4 x i16> @llvm.smin.v4i16(<4 x i16> [[VMIN_V_I]], <4 x i16> [[VMIN_V1_I]]) // LLVM: ret <4 x i16> [[VMIN_V2_I]] return vmin_s16(v1, v2); } @@ -2950,7 +2950,7 @@ int32x2_t test_vmin_s32(int32x2_t v1, int32x2_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <2 x i32> [[V2]] to <8 x i8> // LLVM: [[VMIN_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> // LLVM: [[VMIN_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32> - // LLVM: [[VMIN_V2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.smin.v2i32(<2 x i32> [[VMIN_V_I]], <2 x i32> [[VMIN_V1_I]]) + // LLVM: [[VMIN_V2_I:%.*]] = call <2 x i32> @llvm.smin.v2i32(<2 x i32> [[VMIN_V_I]], <2 x i32> [[VMIN_V1_I]]) // LLVM: ret <2 x i32> [[VMIN_V2_I]] return vmin_s32(v1, v2); } @@ -2961,7 +2961,7 @@ uint8x8_t test_vmin_u8(uint8x8_t v1, uint8x8_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.umin" %{{.*}}, %{{.*}} : (!cir.vector<8 x !u8i>, !cir.vector<8 x !u8i>) -> !cir.vector<8 x !u8i> // LLVM-SAME: <8 x i8> {{.*}} [[V1:%.*]], <8 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMIN_V_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.umin.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) + // LLVM: [[VMIN_V_I:%.*]] = call <8 x i8> @llvm.umin.v8i8(<8 x i8> [[V1]], <8 x i8> [[V2]]) // LLVM: ret <8 x i8> [[VMIN_V_I]] return vmin_u8(v1, v2); } @@ -2976,7 +2976,7 @@ uint16x4_t test_vmin_u16(uint16x4_t v1, uint16x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i16> [[V2]] to <8 x i8> // LLVM: [[VMIN_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> // LLVM: [[VMIN_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x i16> - // LLVM: [[VMIN_V2_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.umin.v4i16(<4 x i16> [[VMIN_V_I]], <4 x i16> [[VMIN_V1_I]]) + // LLVM: [[VMIN_V2_I:%.*]] = call <4 x i16> @llvm.umin.v4i16(<4 x i16> [[VMIN_V_I]], <4 x i16> [[VMIN_V1_I]]) // LLVM: ret <4 x i16> [[VMIN_V2_I]] return vmin_u16(v1, v2); } @@ -2991,7 +2991,7 @@ uint32x2_t test_vmin_u32(uint32x2_t v1, uint32x2_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <2 x i32> [[V2]] to <8 x i8> // LLVM: [[VMIN_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> // LLVM: [[VMIN_V1_I:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x i32> - // LLVM: [[VMIN_V2_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.umin.v2i32(<2 x i32> [[VMIN_V_I]], <2 x i32> [[VMIN_V1_I]]) + // LLVM: [[VMIN_V2_I:%.*]] = call <2 x i32> @llvm.umin.v2i32(<2 x i32> [[VMIN_V_I]], <2 x i32> [[VMIN_V1_I]]) // LLVM: ret <2 x i32> [[VMIN_V2_I]] return vmin_u32(v1, v2); } @@ -3002,7 +3002,7 @@ int8x16_t test_vminq_s8(int8x16_t v1, int8x16_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.smin" %{{.*}}, %{{.*}} : (!cir.vector<16 x !s8i>, !cir.vector<16 x !s8i>) -> !cir.vector<16 x !s8i> // LLVM-SAME: <16 x i8> {{.*}} [[V1:%.*]], <16 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMINQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.smin.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) + // LLVM: [[VMINQ_V_I:%.*]] = call <16 x i8> @llvm.smin.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) // LLVM: ret <16 x i8> [[VMINQ_V_I]] return vminq_s8(v1, v2); } @@ -3017,7 +3017,7 @@ int16x8_t test_vminq_s16(int16x8_t v1, int16x8_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <8 x i16> [[V2]] to <16 x i8> // LLVM: [[VMINQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> // LLVM: [[VMINQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> - // LLVM: [[VMINQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.smin.v8i16(<8 x i16> [[VMINQ_V_I]], <8 x i16> [[VMINQ_V1_I]]) + // LLVM: [[VMINQ_V2_I:%.*]] = call <8 x i16> @llvm.smin.v8i16(<8 x i16> [[VMINQ_V_I]], <8 x i16> [[VMINQ_V1_I]]) // LLVM: ret <8 x i16> [[VMINQ_V2_I]] return vminq_s16(v1, v2); } @@ -3032,7 +3032,7 @@ int32x4_t test_vminq_s32(int32x4_t v1, int32x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i32> [[V2]] to <16 x i8> // LLVM: [[VMINQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // LLVM: [[VMINQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32> - // LLVM: [[VMINQ_V2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.smin.v4i32(<4 x i32> [[VMINQ_V_I]], <4 x i32> [[VMINQ_V1_I]]) + // LLVM: [[VMINQ_V2_I:%.*]] = call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[VMINQ_V_I]], <4 x i32> [[VMINQ_V1_I]]) // LLVM: ret <4 x i32> [[VMINQ_V2_I]] return vminq_s32(v1, v2); } @@ -3043,7 +3043,7 @@ uint8x16_t test_vminq_u8(uint8x16_t v1, uint8x16_t v2) { // CIR: cir.call_llvm_intrinsic "aarch64.neon.umin" %{{.*}}, %{{.*}} : (!cir.vector<16 x !u8i>, !cir.vector<16 x !u8i>) -> !cir.vector<16 x !u8i> // LLVM-SAME: <16 x i8> {{.*}} [[V1:%.*]], <16 x i8> noundef [[V2:%.*]]) {{.*}} { - // LLVM: [[VMINQ_V_I:%.*]] = call <16 x i8> @llvm.aarch64.neon.umin.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) + // LLVM: [[VMINQ_V_I:%.*]] = call <16 x i8> @llvm.umin.v16i8(<16 x i8> [[V1]], <16 x i8> [[V2]]) // LLVM: ret <16 x i8> [[VMINQ_V_I]] return vminq_u8(v1, v2); } @@ -3058,7 +3058,7 @@ uint16x8_t test_vminq_u16(uint16x8_t v1, uint16x8_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <8 x i16> [[V2]] to <16 x i8> // LLVM: [[VMINQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> // LLVM: [[VMINQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x i16> - // LLVM: [[VMINQ_V2_I:%.*]] = call <8 x i16> @llvm.aarch64.neon.umin.v8i16(<8 x i16> [[VMINQ_V_I]], <8 x i16> [[VMINQ_V1_I]]) + // LLVM: [[VMINQ_V2_I:%.*]] = call <8 x i16> @llvm.umin.v8i16(<8 x i16> [[VMINQ_V_I]], <8 x i16> [[VMINQ_V1_I]]) // LLVM: ret <8 x i16> [[VMINQ_V2_I]] return vminq_u16(v1, v2); @@ -3074,7 +3074,7 @@ uint32x4_t test_vminq_u32(uint32x4_t v1, uint32x4_t v2) { // LLVM: [[TMP1:%.*]] = bitcast <4 x i32> [[V2]] to <16 x i8> // LLVM: [[VMINQ_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> // LLVM: [[VMINQ_V1_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x i32> - // LLVM: [[VMINQ_V2_I:%.*]] = call <4 x i32> @llvm.aarch64.neon.umin.v4i32(<4 x i32> [[VMINQ_V_I]], <4 x i32> [[VMINQ_V1_I]]) + // LLVM: [[VMINQ_V2_I:%.*]] = call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[VMINQ_V_I]], <4 x i32> [[VMINQ_V1_I]]) // LLVM: ret <4 x i32> [[VMINQ_V2_I]] return vminq_u32(v1, v2); } diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 16ff20a3d9946..ead8897c19097 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -988,6 +988,22 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, return true; } + // Check for the trailing '.' to avoid matching sminv, sminp, etc. + if (Name.starts_with("smax.") || Name.starts_with("smin.") || + Name.starts_with("umax.") || Name.starts_with("umin.")) { + if (F->arg_size() != 2 || !F->getReturnType()->isIntOrIntVectorTy()) + return false; // Invalid IR. + Intrinsic::ID ID = StringSwitch<Intrinsic::ID>(Name.take_front(4)) + .Case("smax", Intrinsic::smax) + .Case("smin", Intrinsic::smin) + .Case("umax", Intrinsic::umax) + .Case("umin", Intrinsic::umin) + .Default(Intrinsic::not_intrinsic); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + F->getReturnType()); + return true; + } + if (Name.starts_with("addp")) { // 'aarch64.neon.addp*'. if (F->arg_size() != 2) diff --git a/llvm/test/Bitcode/aarch64-neon-minmax-upgrade.ll b/llvm/test/Bitcode/aarch64-neon-minmax-upgrade.ll new file mode 100644 index 0000000000000..068b58b7724cf --- /dev/null +++ b/llvm/test/Bitcode/aarch64-neon-minmax-upgrade.ll @@ -0,0 +1,59 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s +; RUN: verify-uselistorder < %s + +define <4 x i32> @smin(<4 x i32> %a, <4 x i32> %b) { +; CHECK-LABEL: @smin +; CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b) + %r = call <4 x i32> @llvm.aarch64.neon.smin.v4i32(<4 x i32> %a, <4 x i32> %b) + ret <4 x i32> %r +} + +define <8 x i16> @smax(<8 x i16> %a, <8 x i16> %b) { +; CHECK-LABEL: @smax +; CHECK: call <8 x i16> @llvm.smax.v8i16(<8 x i16> %a, <8 x i16> %b) + %r = call <8 x i16> @llvm.aarch64.neon.smax.v8i16(<8 x i16> %a, <8 x i16> %b) + ret <8 x i16> %r +} + +define <16 x i8> @umin(<16 x i8> %a, <16 x i8> %b) { +; CHECK-LABEL: @umin +; CHECK: call <16 x i8> @llvm.umin.v16i8(<16 x i8> %a, <16 x i8> %b) + %r = call <16 x i8> @llvm.aarch64.neon.umin.v16i8(<16 x i8> %a, <16 x i8> %b) + ret <16 x i8> %r +} + +define <2 x i32> @umax(<2 x i32> %a, <2 x i32> %b) { +; CHECK-LABEL: @umax +; CHECK: call <2 x i32> @llvm.umax.v2i32(<2 x i32> %a, <2 x i32> %b) + %r = call <2 x i32> @llvm.aarch64.neon.umax.v2i32(<2 x i32> %a, <2 x i32> %b) + ret <2 x i32> %r +} + +define i32 @sminv_not_upgraded(<4 x i32> %a) { +; CHECK-LABEL: @sminv_not_upgraded +; CHECK: call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> %a) + %r = call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> %a) + ret i32 %r +} + +define <4 x i32> @sminp_not_upgraded(<4 x i32> %a, <4 x i32> %b) { +; CHECK-LABEL: @sminp_not_upgraded +; CHECK: call <4 x i32> @llvm.aarch64.neon.sminp.v4i32(<4 x i32> %a, <4 x i32> %b) + %r = call <4 x i32> @llvm.aarch64.neon.sminp.v4i32(<4 x i32> %a, <4 x i32> %b) + ret <4 x i32> %r +} + +define <4 x i32> @umaxp_not_upgraded(<4 x i32> %a, <4 x i32> %b) { +; CHECK-LABEL: @umaxp_not_upgraded +; CHECK: call <4 x i32> @llvm.aarch64.neon.umaxp.v4i32(<4 x i32> %a, <4 x i32> %b) + %r = call <4 x i32> @llvm.aarch64.neon.umaxp.v4i32(<4 x i32> %a, <4 x i32> %b) + ret <4 x i32> %r +} + +declare <4 x i32> @llvm.aarch64.neon.smin.v4i32(<4 x i32>, <4 x i32>) +declare <8 x i16> @llvm.aarch64.neon.smax.v8i16(<8 x i16>, <8 x i16>) +declare <16 x i8> @llvm.aarch64.neon.umin.v16i8(<16 x i8>, <16 x i8>) +declare <2 x i32> @llvm.aarch64.neon.umax.v2i32(<2 x i32>, <2 x i32>) +declare i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32>) +declare <4 x i32> @llvm.aarch64.neon.sminp.v4i32(<4 x i32>, <4 x i32>) +declare <4 x i32> @llvm.aarch64.neon.umaxp.v4i32(<4 x i32>, <4 x i32>) diff --git a/llvm/test/CodeGen/AArch64/abd-combine.ll b/llvm/test/CodeGen/AArch64/abd-combine.ll index 2d146d956ceea..8ceac6b69865a 100644 --- a/llvm/test/CodeGen/AArch64/abd-combine.ll +++ b/llvm/test/CodeGen/AArch64/abd-combine.ll @@ -504,10 +504,9 @@ define <8 x i16> @abds_i_reassoc(<8 x i16> %src1) { define <1 x i64> @recursive() { ; CHECK-LABEL: recursive: ; CHECK: // %bb.0: -; CHECK-NEXT: movi v0.8b, #254 -; CHECK-NEXT: ushll v1.8h, v0.8b, #0 -; CHECK-NEXT: dup v0.8b, v0.b[0] -; CHECK-NEXT: saddlp v1.1d, v1.2s +; CHECK-NEXT: movi v0.4h, #254 +; CHECK-NEXT: movi v1.8b, #254 +; CHECK-NEXT: saddlp v0.1d, v0.2s ; CHECK-NEXT: orr v0.8b, v0.8b, v1.8b ; CHECK-NEXT: ret %1 = tail call <8 x i8> @llvm.aarch64.neon.umax.v8i8(<8 x i8> zeroinitializer, <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>) diff --git a/llvm/test/Instrumentation/MemorySanitizer/AArch64/arm64-vmax.ll b/llvm/test/Instrumentation/MemorySanitizer/AArch64/arm64-vmax.ll index d6d88956a4f68..60ccce34bf32c 100644 --- a/llvm/test/Instrumentation/MemorySanitizer/AArch64/arm64-vmax.ll +++ b/llvm/test/Instrumentation/MemorySanitizer/AArch64/arm64-vmax.ll @@ -34,7 +34,7 @@ define <8 x i8> @smax_8b(ptr %A, ptr %B) nounwind #0 { ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0 ; CHECK-NEXT: br i1 [[_MSCMP]], label %[[BB3:.*]], label %[[BB4:.*]], !prof [[PROF1:![0-9]+]] ; CHECK: [[BB3]]: -; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR3:[0-9]+]] +; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]] ; CHECK-NEXT: unreachable ; CHECK: [[BB4]]: ; CHECK-NEXT: [[TMPVAR1:%.*]] = load <8 x i8>, ptr [[A]], align 8 @@ -45,7 +45,7 @@ define <8 x i8> @smax_8b(ptr %A, ptr %B) nounwind #0 { ; CHECK-NEXT: [[_MSCMP2:%.*]] = icmp ne i64 [[TMP2]], 0 ; CHECK-NEXT: br i1 ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/225339 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
