
Type::isScalableTy and StructType::containsScalableVectorType failed to detect some cases of structs containing scalable vectors because containsScalableVectorType did not call back into isScalableTy to check the element types. Fix this, which requires sharing the same Visited set in both functions. Also change the external API so that callers are never required to pass in a Visited set, and normalize the naming to isScalableTy.
32 lines
1.3 KiB
LLVM
32 lines
1.3 KiB
LLVM
; RUN: not opt -S -passes=verify < %s 2>&1 | FileCheck %s
|
|
|
|
;; Global variables cannot be scalable vectors, since we don't
|
|
;; know the size at compile time.
|
|
|
|
; CHECK: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @ScalableVecGlobal
|
|
@ScalableVecGlobal = global <vscale x 4 x i32> zeroinitializer
|
|
|
|
; CHECK-NEXT: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @ScalableVecArrayGlobal
|
|
@ScalableVecArrayGlobal = global [ 8 x <vscale x 4 x i32> ] zeroinitializer
|
|
|
|
; CHECK-NEXT: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @ScalableVecStructGlobal
|
|
@ScalableVecStructGlobal = global { i32, <vscale x 4 x i32> } zeroinitializer
|
|
|
|
; CHECK-NEXT: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @StructTestGlobal
|
|
%struct.test = type { <vscale x 1 x double>, <vscale x 1 x double> }
|
|
@StructTestGlobal = global %struct.test zeroinitializer
|
|
|
|
; CHECK-NEXT: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @StructArrayTestGlobal
|
|
%struct.array.test = type { [2 x <vscale x 1 x double>] }
|
|
@StructArrayTestGlobal = global %struct.array.test zeroinitializer
|
|
|
|
; CHECK-NEXT: Globals cannot contain scalable types
|
|
; CHECK-NEXT: ptr @StructTargetTestGlobal
|
|
%struct.target.test = type { target("aarch64.svcount"), target("aarch64.svcount") }
|
|
@StructTargetTestGlobal = global %struct.target.test zeroinitializer
|