From 3d47b253d79e054a41390f8a5f3889b107bd0709 Mon Sep 17 00:00:00 2001 From: Kai Nacke Date: Mon, 22 Apr 2024 17:03:44 -0400 Subject: [PATCH 1/2] [SystemZ][z/OS] Make z/OS personality function known This change adds the z/OS personality function to the list of known EH personality functions. It enables removing of the EH data/labels if the personality function is not invoked. --- llvm/include/llvm/IR/EHPersonalities.h | 3 ++- llvm/lib/IR/EHPersonalities.cpp | 3 +++ .../Transforms/InstCombine/InstructionCombining.cpp | 1 + llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll | 12 ++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll diff --git a/llvm/include/llvm/IR/EHPersonalities.h b/llvm/include/llvm/IR/EHPersonalities.h index bd768440bfb9a..c70f832de40b4 100644 --- a/llvm/include/llvm/IR/EHPersonalities.h +++ b/llvm/include/llvm/IR/EHPersonalities.h @@ -32,7 +32,8 @@ enum class EHPersonality { CoreCLR, Rust, Wasm_CXX, - XL_CXX + XL_CXX, + ZOS_CXX, }; /// See if the given exception handling personality function is one diff --git a/llvm/lib/IR/EHPersonalities.cpp b/llvm/lib/IR/EHPersonalities.cpp index fb5e2d5c517ec..81ccb30a7c365 100644 --- a/llvm/lib/IR/EHPersonalities.cpp +++ b/llvm/lib/IR/EHPersonalities.cpp @@ -42,6 +42,7 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) { .Case("rust_eh_personality", EHPersonality::Rust) .Case("__gxx_wasm_personality_v0", EHPersonality::Wasm_CXX) .Case("__xlcxx_personality_v1", EHPersonality::XL_CXX) + .Case("__zos_cxx_personality_v2", EHPersonality::ZOS_CXX) .Default(EHPersonality::Unknown); } @@ -73,6 +74,8 @@ StringRef llvm::getEHPersonalityName(EHPersonality Pers) { return "__gxx_wasm_personality_v0"; case EHPersonality::XL_CXX: return "__xlcxx_personality_v1"; + case EHPersonality::ZOS_CXX: + return "__zos_cxx_personality_v2"; case EHPersonality::Unknown: llvm_unreachable("Unknown EHPersonality!"); } diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 3ac5c2559ddf9..f6684834a7722 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -3972,6 +3972,7 @@ static bool isCatchAll(EHPersonality Personality, Constant *TypeInfo) { case EHPersonality::CoreCLR: case EHPersonality::Wasm_CXX: case EHPersonality::XL_CXX: + case EHPersonality::ZOS_CXX: return TypeInfo->isNullValue(); } llvm_unreachable("invalid enum"); diff --git a/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll b/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll new file mode 100644 index 0000000000000..b28f0dd17599a --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/zos-no-eh-label.ll @@ -0,0 +1,12 @@ +; RUN: llc -mtriple s390x-ibm-zos < %s | FileCheck %s + +define signext i32 @_Z9computeitv() personality ptr @__zos_cxx_personality_v2 { + ret i32 0 +} + +declare i32 @__zos_cxx_personality_v2(...) + +; The personality function is unused, therefore check that it is not referenced. +; There should also be no exception table. +; CHECK-NOT: __zos_cxx_personality_v2 +; CHECK-NOT: GCC_except_table From 56bfe60a6f3c2cb1a071d3f5523a10b38fc52b9a Mon Sep 17 00:00:00 2001 From: Kai Nacke Date: Tue, 23 Apr 2024 10:30:24 -0400 Subject: [PATCH 2/2] Fix formatting issue. --- llvm/lib/IR/EHPersonalities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/IR/EHPersonalities.cpp b/llvm/lib/IR/EHPersonalities.cpp index 81ccb30a7c365..7c32601b8a83e 100644 --- a/llvm/lib/IR/EHPersonalities.cpp +++ b/llvm/lib/IR/EHPersonalities.cpp @@ -42,7 +42,7 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) { .Case("rust_eh_personality", EHPersonality::Rust) .Case("__gxx_wasm_personality_v0", EHPersonality::Wasm_CXX) .Case("__xlcxx_personality_v1", EHPersonality::XL_CXX) - .Case("__zos_cxx_personality_v2", EHPersonality::ZOS_CXX) + .Case("__zos_cxx_personality_v2", EHPersonality::ZOS_CXX) .Default(EHPersonality::Unknown); }