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

Reply via email to