From 47e44c0c2ebdbdef9046edbe8422a3dd1bea63da Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 2 Jan 2023 08:25:26 -0500 Subject: [PATCH] llvm-reduce: Add reduction for function personalities Fixes second piece of #58815 --- .../llvm-reduce/reduce-function-personality.ll | 58 ++++++++++++++++++++++ llvm/tools/llvm-reduce/DeltaManager.cpp | 1 + .../llvm-reduce/deltas/ReduceFunctionBodies.cpp | 24 +++++++++ .../llvm-reduce/deltas/ReduceFunctionBodies.h | 1 + 4 files changed, 84 insertions(+) create mode 100644 llvm/test/tools/llvm-reduce/reduce-function-personality.ll diff --git a/llvm/test/tools/llvm-reduce/reduce-function-personality.ll b/llvm/test/tools/llvm-reduce/reduce-function-personality.ll new file mode 100644 index 0000000..260da6e --- /dev/null +++ b/llvm/test/tools/llvm-reduce/reduce-function-personality.ll @@ -0,0 +1,58 @@ +; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=function-data --test FileCheck --test-arg --check-prefixes=CHECK,INTERESTING --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck -check-prefixes=CHECK,RESULT %s < %t + +; INTERESTING: define void @drop_personality( +; RESULT: define void @drop_personality() { +define void @drop_personality() personality ptr @__gxx_personality_v0 { + ret void +} + +; CHECK: define void @keep_personality() personality ptr @__gxx_personality_v0 { +define void @keep_personality() personality ptr @__gxx_personality_v0 { + ret void +} + +; Make sure an invalid reduction isn't produced if we need a +; personality function for different instructions + +; CHECK: define void @landingpad_requires_personality() +; RESULT-SAME: personality ptr @__gxx_personality_v0 { +define void @landingpad_requires_personality() personality ptr @__gxx_personality_v0 { +bb0: + br label %bb2 + +bb1: + landingpad { ptr, i32 } + catch ptr null + ret void + +bb2: + ret void +} + +; CHECK-LABEL: define void @uses_catchpad() +; RESULT-SAME: personality ptr @__CxxFrameHandler3 { +define void @uses_catchpad() personality ptr @__CxxFrameHandler3 { +entry: + br label %unreachable + +catch.dispatch: + %cs = catchswitch within none [label %catch] unwind to caller + +catch: + %cp = catchpad within %cs [ptr null, i32 64, ptr null] + br label %unreachable + +unreachable: + unreachable +} + +; CHECK-LABEL: define void @uses_resume() +; RESULT-SAME: personality ptr @__gxx_personality_v0 +define void @uses_resume() personality ptr @__gxx_personality_v0 { +entry: + resume { ptr, i32 } zeroinitializer +} + +declare i32 @__gxx_personality_v0(...) +declare i32 @__CxxFrameHandler3(...) diff --git a/llvm/tools/llvm-reduce/DeltaManager.cpp b/llvm/tools/llvm-reduce/DeltaManager.cpp index 537a097..7927de5 100644 --- a/llvm/tools/llvm-reduce/DeltaManager.cpp +++ b/llvm/tools/llvm-reduce/DeltaManager.cpp @@ -79,6 +79,7 @@ static cl::list DELTA_PASS("unreachable-basic-blocks", reduceUnreachableBasicBlocksDeltaPass) \ DELTA_PASS("basic-blocks", reduceBasicBlocksDeltaPass) \ DELTA_PASS("simplify-cfg", reduceUsingSimplifyCFGDeltaPass) \ + DELTA_PASS("function-data", reduceFunctionDataDeltaPass) \ DELTA_PASS("global-values", reduceGlobalValuesDeltaPass) \ DELTA_PASS("global-objects", reduceGlobalObjectsDeltaPass) \ DELTA_PASS("global-initializers", reduceGlobalsInitializersDeltaPass) \ diff --git a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp index 19cda6d..89dcbf4 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp @@ -15,6 +15,7 @@ #include "Delta.h" #include "Utils.h" #include "llvm/IR/GlobalValue.h" +#include "llvm/IR/Instructions.h" using namespace llvm; @@ -34,3 +35,26 @@ void llvm::reduceFunctionBodiesDeltaPass(TestRunner &Test) { runDeltaPass(Test, extractFunctionBodiesFromModule, "Reducing Function Bodies"); } + +static void reduceFunctionData(Oracle &O, Module &M) { + for (Function &F : M) { + if (F.isDeclaration()) + continue; + + if (F.hasPersonalityFn()) { + if (none_of(F, + [](const BasicBlock &BB) { + return BB.isEHPad() || isa(BB.getTerminator()); + }) && + !O.shouldKeep()) { + F.setPersonalityFn(nullptr); + } + } + + // TODO: Handle prefix data and prologue data + } +} + +void llvm::reduceFunctionDataDeltaPass(TestRunner &Test) { + runDeltaPass(Test, reduceFunctionData, "Reducing Function Data"); +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h index 1713dfc..ae738fb 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h +++ b/llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.h @@ -18,6 +18,7 @@ namespace llvm { void reduceFunctionBodiesDeltaPass(TestRunner &Test); +void reduceFunctionDataDeltaPass(TestRunner &Test); } // namespace llvm #endif -- 2.7.4