[llvm-link] fix IRMover returning wrong modified vector type
authorNashe Mncube <nashe.mncube@arm.com>
Fri, 19 Feb 2021 11:34:58 +0000 (11:34 +0000)
committerNashe Mncube <nashe.mncube@arm.com>
Mon, 22 Feb 2021 11:29:42 +0000 (11:29 +0000)
Modified scalable vector types weren't correctly returned at link-time.
The previous behaviour was a FixedVectorType was constructed
when expecting a ScalableVectorType. This commit has added a regression
test which re-creates the failure as well as a fix.

Reviewed By: sdesmalen

Differential Revision: https://reviews.llvm.org/D96953

llvm/lib/Linker/IRMover.cpp
llvm/test/Linker/Inputs/fixed-vector-type-construction.ll [new file with mode: 0644]
llvm/test/Linker/scalable-vector-type-construction.ll [new file with mode: 0644]

index 4d7c5ef..1004e4e 100644 (file)
@@ -298,10 +298,9 @@ Type *TypeMapTy::get(Type *Ty, SmallPtrSet<StructType *, 8> &Visited) {
     return *Entry = ArrayType::get(ElementTypes[0],
                                    cast<ArrayType>(Ty)->getNumElements());
   case Type::ScalableVectorTyID:
-    // FIXME: handle scalable vectors
   case Type::FixedVectorTyID:
-    return *Entry = FixedVectorType::get(
-               ElementTypes[0], cast<FixedVectorType>(Ty)->getNumElements());
+    return *Entry = VectorType::get(ElementTypes[0],
+                                    cast<VectorType>(Ty)->getElementCount());
   case Type::PointerTyID:
     return *Entry = PointerType::get(ElementTypes[0],
                                      cast<PointerType>(Ty)->getAddressSpace());
diff --git a/llvm/test/Linker/Inputs/fixed-vector-type-construction.ll b/llvm/test/Linker/Inputs/fixed-vector-type-construction.ll
new file mode 100644 (file)
index 0000000..1b6baf5
--- /dev/null
@@ -0,0 +1,4 @@
+%t = type {i32, float}
+define void @foo(<4 x %t*> %x) {
+  ret void
+}
diff --git a/llvm/test/Linker/scalable-vector-type-construction.ll b/llvm/test/Linker/scalable-vector-type-construction.ll
new file mode 100644 (file)
index 0000000..ae95af5
--- /dev/null
@@ -0,0 +1,7 @@
+; RUN: llvm-link %p/Inputs/fixed-vector-type-construction.ll %s -S -o - | FileCheck %s
+%t = type {i32, float}
+; CHECK: define void @foo(<4 x
+; CHECK; define void @bar(<vscale x 4 x
+define void @bar(<vscale x 4 x %t*> %x) {
+  ret void
+}