llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Benjamin Maxwell (MacDue)

<details>
<summary>Changes</summary>

Previously, this hit an `llvm_unreachable()` assertion as the type of `vec_t` 
did not exactly match the return type of `svdup_s8`, as it was wrapped in a 
typedef.

Comparing the canonical types instead allows the types to match correctly and 
avoids the crash.

Fixes #<!-- -->107609

---
Full diff: https://github.com/llvm/llvm-project/pull/118956.diff


2 Files Affected:

- (modified) clang/lib/CodeGen/CGExprScalar.cpp (+2-1) 
- (added) clang/test/CodeGenCXX/aarch64-sve-vector-init-typedef.cpp (+23) 


``````````diff
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp 
b/clang/lib/CodeGen/CGExprScalar.cpp
index 4ae8a2b22b1bba..bbf68a4c66192a 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -2102,7 +2102,8 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr 
*E) {
       Expr *InitVector = E->getInit(0);
 
       // Initialize from another scalable vector of the same type.
-      if (InitVector->getType() == E->getType())
+      if (InitVector->getType().getCanonicalType() ==
+          E->getType().getCanonicalType())
         return Visit(InitVector);
     }
 
diff --git a/clang/test/CodeGenCXX/aarch64-sve-vector-init-typedef.cpp 
b/clang/test/CodeGenCXX/aarch64-sve-vector-init-typedef.cpp
new file mode 100644
index 00000000000000..3ac0fc5f39a566
--- /dev/null
+++ b/clang/test/CodeGenCXX/aarch64-sve-vector-init-typedef.cpp
@@ -0,0 +1,23 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 2
+// RUN: %clang_cc1 -fclang-abi-compat=latest -triple aarch64-none-linux-gnu 
-target-feature +sve -emit-llvm -o - %s | FileCheck %s
+
+#include <arm_sve.h>
+
+using vec_t = svint8_t;
+
+/// From: https://github.com/llvm/llvm-project/issues/107609
+/// The type of `vec` is a typedef of svint8_t, while svdup_s8 returns the 
non-typedef'd type.
+
+// CHECK-LABEL: define dso_local <vscale x 16 x i8> @_Z20sve_init_dup_typedefv
+// CHECK-SAME: () #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[VEC:%.*]] = alloca <vscale x 16 x i8>, align 16
+// CHECK-NEXT:    [[TMP0:%.*]] = call <vscale x 16 x i8> 
@llvm.aarch64.sve.dup.x.nxv16i8(i8 2)
+// CHECK-NEXT:    store <vscale x 16 x i8> [[TMP0]], ptr [[VEC]], align 16
+// CHECK-NEXT:    [[TMP1:%.*]] = load <vscale x 16 x i8>, ptr [[VEC]], align 16
+// CHECK-NEXT:    ret <vscale x 16 x i8> [[TMP1]]
+//
+vec_t sve_init_dup_typedef() {
+  vec_t vec{svdup_s8(2)};
+  return vec;
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/118956
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to