[llvm] [IR] Add TargetExtType::CanBeAlloca property (PR #99016)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 16 03:34:29 PDT 2024
https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/99016
Add a property to allow marking target extension types that cannot be
used in an alloca instruction, similar to CanBeGlobal for global
variables.
>From 4aeea63a09a56f3ce5e0be2f02088194b617b9d8 Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Tue, 16 Jul 2024 11:29:05 +0100
Subject: [PATCH] [IR] Add TargetExtType::CanBeAlloca property
Add a property to allow marking target extension types that cannot be
used in an alloca instruction, similar to CanBeGlobal for global
variables.
---
llvm/include/llvm/IR/DerivedTypes.h | 2 ++
llvm/lib/IR/Type.cpp | 6 ++++--
llvm/lib/IR/Verifier.cpp | 6 ++++++
llvm/test/Assembler/target-type-properties.ll | 8 ++++++++
4 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/IR/DerivedTypes.h b/llvm/include/llvm/IR/DerivedTypes.h
index 01f76d4932780..054cb370bc316 100644
--- a/llvm/include/llvm/IR/DerivedTypes.h
+++ b/llvm/include/llvm/IR/DerivedTypes.h
@@ -769,6 +769,8 @@ class TargetExtType : public Type {
HasZeroInit = 1U << 0,
/// This type may be used as the value type of a global variable.
CanBeGlobal = 1U << 1,
+ /// This type may be used as the allocated type of an alloca instruction.
+ CanBeAlloca = 1U << 2,
};
/// Returns true if the target extension type contains the given property.
diff --git a/llvm/lib/IR/Type.cpp b/llvm/lib/IR/Type.cpp
index 5c61ad9f000b0..3f982ef520e92 100644
--- a/llvm/lib/IR/Type.cpp
+++ b/llvm/lib/IR/Type.cpp
@@ -838,12 +838,14 @@ static TargetTypeInfo getTargetTypeInfo(const TargetExtType *Ty) {
return TargetTypeInfo(PointerType::get(C, 0), TargetExtType::CanBeGlobal);
if (Name.starts_with("spirv."))
return TargetTypeInfo(PointerType::get(C, 0), TargetExtType::HasZeroInit,
- TargetExtType::CanBeGlobal);
+ TargetExtType::CanBeGlobal,
+ TargetExtType::CanBeAlloca);
// Opaque types in the AArch64 name space.
if (Name == "aarch64.svcount")
return TargetTypeInfo(ScalableVectorType::get(Type::getInt1Ty(C), 16),
- TargetExtType::HasZeroInit);
+ TargetExtType::HasZeroInit,
+ TargetExtType::CanBeAlloca);
return TargetTypeInfo(Type::getVoidTy(C));
}
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 75a53c1c99734..e59dc6bf24d38 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -4273,6 +4273,12 @@ void Verifier::visitAllocaInst(AllocaInst &AI) {
SmallPtrSet<Type*, 4> Visited;
Check(AI.getAllocatedType()->isSized(&Visited),
"Cannot allocate unsized type", &AI);
+ // Check if it's a target extension type that disallows being used in an
+ // alloca.
+ if (auto *TTy = dyn_cast<TargetExtType>(AI.getAllocatedType())) {
+ Check(TTy->hasProperty(TargetExtType::CanBeAlloca),
+ "Alloca has illegal target extension type", &AI);
+ }
Check(AI.getArraySize()->getType()->isIntegerTy(),
"Alloca array size must have integer type", &AI);
if (MaybeAlign A = AI.getAlign()) {
diff --git a/llvm/test/Assembler/target-type-properties.ll b/llvm/test/Assembler/target-type-properties.ll
index 49c9d812f1cf4..eae5eec04da85 100644
--- a/llvm/test/Assembler/target-type-properties.ll
+++ b/llvm/test/Assembler/target-type-properties.ll
@@ -1,6 +1,7 @@
; RUN: split-file %s %t
; RUN: not llvm-as < %t/zeroinit-error.ll -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-ZEROINIT %s
; RUN: not llvm-as < %t/global-var.ll -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-GLOBALVAR %s
+; RUN: not llvm-as < %t/alloca.ll -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-ALLOCA %s
; Check target extension type properties are verified in the assembler.
;--- zeroinit-error.ll
@@ -14,3 +15,10 @@ define void @foo() {
;--- global-var.ll
@global = external global target("unknown_target_type")
; CHECK-GLOBALVAR: Global @global has illegal target extension type
+
+;--- alloca.ll
+define void @foo() {
+ %val = alloca target("spirv.Image")
+; CHECK-ALLOCA: Alloca has illegal target extension type
+ ret void
+}
More information about the llvm-commits
mailing list