From: Arthur Eubanks Date: Tue, 18 Oct 2022 04:14:05 +0000 (-0700) Subject: [llvm-reduce] Check if reduction fails/is redundant before invoking oracle X-Git-Tag: upstream/17.0.6~30231 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce3c3cb2912425bb4367bfbe9a4c68a6d6f0a04a;p=platform%2Fupstream%2Fllvm.git [llvm-reduce] Check if reduction fails/is redundant before invoking oracle So we don't over count the number of chunks and do unnecessary work reducing more chunks than exist. This lowers some random reduction I tested with locally from 250s to 232s. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D136127 --- diff --git a/llvm/test/tools/llvm-reduce/oracle-count.ll b/llvm/test/tools/llvm-reduce/oracle-count.ll new file mode 100644 index 0000000..948c6da --- /dev/null +++ b/llvm/test/tools/llvm-reduce/oracle-count.ll @@ -0,0 +1,23 @@ +; RUN: llvm-reduce --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2>&1 | FileCheck %s --check-prefix=CHECK-LOG +; RUN: FileCheck --check-prefixes=CHECK-FINAL --input-file=%t %s + +; CHECK-INTERESTINGNESS: ret i32 +; CHECK-FINAL: ret i32 0 + +; Test that we don't invoke the oracle more than necessary (e.g. check the +; oracle then perform some failable/redundant reduction, as opposed to check if +; a reduction will fail/be redundant before invoking the oracle). This prevents +; overestimation of the number of possible reductions and the number of times we +; attempt to reduce. + +; IR passes +; CHECK-LOG: Saved new best reduction +; Module data +; CHECK-LOG: Saved new best reduction +; SimplifyCFG +; CHECK-LOG: Saved new best reduction +; CHECK-LOG-NOT: Saved new best reduction + +define i32 @f() { + ret i32 0 +} \ No newline at end of file diff --git a/llvm/tools/llvm-reduce/deltas/ReduceOpcodes.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOpcodes.cpp index 99beb31..776027d 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceOpcodes.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceOpcodes.cpp @@ -87,12 +87,13 @@ static void replaceOpcodesInModule(Oracle &O, Module &Mod) { for (Function &F : Mod) { for (BasicBlock &BB : F) for (Instruction &I : make_early_inc_range(BB)) { - if (O.shouldKeep()) - continue; Instruction *Replacement = dyn_cast_or_null(reduceInstruction(Mod, I)); if (Replacement && Replacement != &I) { + if (O.shouldKeep()) + continue; + if (isa(Replacement)) Replacement->copyFastMathFlags(&I); diff --git a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp index 348421b..98d068f 100644 --- a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp +++ b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp @@ -34,8 +34,8 @@ extractOperandsFromModule(Oracle &O, Module &Program, } for (auto &Op : I.operands()) { - if (!O.shouldKeep()) { - if (Value *Reduced = ReduceValue(Op)) + if (Value *Reduced = ReduceValue(Op)) { + if (!O.shouldKeep()) Op.set(Reduced); } } diff --git a/llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp b/llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp index 7bf3eb1..93556b7 100644 --- a/llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp +++ b/llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp @@ -28,11 +28,11 @@ static void extractInstrFromModule(Oracle &O, Module &Program) { for (auto &F : Program) { for (auto &BB : F) { for (auto &Inst : BB) { - if (O.shouldKeep()) - continue; SimplifyQuery Q(DL, &Inst); if (Value *Simplified = simplifyInstruction(&Inst, Q)) { + if (O.shouldKeep()) + continue; Inst.replaceAllUsesWith(Simplified); InstToDelete.push_back(&Inst); }