https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/133854
I assume this was a leftover from typed pointers. It's easier to replace the non-callee uses, they are just replacable pointer values. >From 83ba71fe5eff72cd5f08b41a848c44b93dea3de9 Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Tue, 1 Apr 2025 10:19:10 +0700 Subject: [PATCH] llvm-reduce: Fix overly conservative operands-to-args user restriction I assume this was a leftover from typed pointers. It's easier to replace the non-callee uses, they are just replacable pointer values. --- llvm/test/tools/llvm-reduce/operands-to-args.ll | 6 +++--- .../llvm-reduce/deltas/ReduceOperandsToArgs.cpp | 16 +++++++--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/llvm/test/tools/llvm-reduce/operands-to-args.ll b/llvm/test/tools/llvm-reduce/operands-to-args.ll index 3378f15e58936..1765ffc25ae5f 100644 --- a/llvm/test/tools/llvm-reduce/operands-to-args.ll +++ b/llvm/test/tools/llvm-reduce/operands-to-args.ll @@ -77,7 +77,7 @@ define void @f(ptr %a) { @gv_init_use = global [1 x ptr] [ptr @has_global_init_user] ; INTERESTING-LABEL: define void @has_global_init_user( -; REDUCED-LABEL: define void @has_global_init_user() { +; REDUCED-LABEL: define void @has_global_init_user(ptr %Local) { define void @has_global_init_user() { %Local = alloca i32, align 4 store i32 42, ptr %Local, align 4 @@ -85,7 +85,7 @@ define void @has_global_init_user() { } ; INTERESTING-LABEL: define void @has_callee_and_arg_user( -; REDUCED-LABEL: define void @has_callee_and_arg_user(ptr %orig.arg) { +; REDUCED-LABEL: define void @has_callee_and_arg_user(ptr %orig.arg, ptr %Local) { define void @has_callee_and_arg_user(ptr %orig.arg) { %Local = alloca i32, align 4 store i32 42, ptr %Local, align 4 @@ -96,7 +96,7 @@ declare void @ptr_user(ptr) ; INTERESTING-LABEL: define void @calls_and_passes_func( ; REDUCED-LABEL: define void @calls_and_passes_func(ptr %has_callee_and_arg_user) { -; REDUCED: call void @has_callee_and_arg_user(ptr %has_callee_and_arg_user) +; REDUCED: call void @has_callee_and_arg_user(ptr %has_callee_and_arg_user, ptr null) define void @calls_and_passes_func() { call void @has_callee_and_arg_user(ptr @has_callee_and_arg_user) ret void diff --git a/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp index 3548130d3276a..af873791b0abe 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp @@ -19,12 +19,9 @@ using namespace llvm; -static bool canReplaceFunction(Function *F) { - return all_of(F->uses(), [](Use &Op) { - if (auto *CI = dyn_cast<CallBase>(Op.getUser())) - return &CI->getCalledOperandUse() == &Op; - return false; - }); +static bool canReplaceFunction(const Function &F) { + // TODO: Add controls to avoid ABI breaks (e.g. don't break main) + return true; } static bool canReduceUse(Use &Op) { @@ -59,8 +56,9 @@ static bool canReduceUse(Use &Op) { static void replaceFunctionCalls(Function *OldF, Function *NewF) { SmallVector<CallBase *> Callers; for (Use &U : OldF->uses()) { - auto *CI = cast<CallBase>(U.getUser()); - assert(&U == &CI->getCalledOperandUse()); + auto *CI = dyn_cast<CallBase>(U.getUser()); + if (!CI || !CI->isCallee(&U)) // RAUW can handle these fine. + continue; Function *CalledF = CI->getCalledFunction(); if (CalledF == OldF) { @@ -209,7 +207,7 @@ void llvm::reduceOperandsToArgsDeltaPass(Oracle &O, ReducerWorkItem &WorkItem) { SmallVector<Use *> OperandsToReduce; for (Function &F : make_early_inc_range(Program.functions())) { - if (!canReplaceFunction(&F)) + if (!canReplaceFunction(F)) continue; OperandsToReduce.clear(); for (Instruction &I : instructions(&F)) { _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits