diff --git a/llvm/test/tools/llvm-reduce/operands-to-args.ll b/llvm/test/tools/llvm-reduce/operands-to-args.ll --- a/llvm/test/tools/llvm-reduce/operands-to-args.ll +++ b/llvm/test/tools/llvm-reduce/operands-to-args.ll @@ -54,3 +54,19 @@ ret void } + +; Make sure to skip functions with non-direct call users +declare void @e(i8*) + +; INTERESTING-LABEL: define void @g() { +define void @g() { + call void @e(i8* bitcast (void (i8**)* @f to i8*)) + ret void +} + +; INTERESTING-LABEL: define void @f(i8** %a) { +define void @f(i8** %a) { + %1 = load i8*, i8** %a + %2 = bitcast i8* %1 to i32* + ret void +} diff --git a/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp --- a/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceOperandsToArgs.cpp @@ -174,6 +174,8 @@ static void reduceOperandsToArgs(Oracle &O, Module &Program) { SmallVector OperandsToReduce; for (Function &F : make_early_inc_range(Program.functions())) { + if (!canReplaceFunction(&F)) + continue; OperandsToReduce.clear(); for (Instruction &I : instructions(&F)) { for (Use &Op : I.operands()) {