[llvm] ce3c3cb - [llvm-reduce] Check if reduction fails/is redundant before invoking oracle

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 18 08:44:07 PDT 2022


Author: Arthur Eubanks
Date: 2022-10-18T08:43:56-07:00
New Revision: ce3c3cb2912425bb4367bfbe9a4c68a6d6f0a04a

URL: https://github.com/llvm/llvm-project/commit/ce3c3cb2912425bb4367bfbe9a4c68a6d6f0a04a
DIFF: https://github.com/llvm/llvm-project/commit/ce3c3cb2912425bb4367bfbe9a4c68a6d6f0a04a.diff

LOG: [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

Added: 
    llvm/test/tools/llvm-reduce/oracle-count.ll

Modified: 
    llvm/tools/llvm-reduce/deltas/ReduceOpcodes.cpp
    llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
    llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp

Removed: 
    


################################################################################
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 0000000000000..948c6da262e24
--- /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 99beb318ef169..776027d553ebe 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<Instruction>(reduceInstruction(Mod, I));
         if (Replacement && Replacement != &I) {
+          if (O.shouldKeep())
+            continue;
+
           if (isa<FPMathOperator>(Replacement))
             Replacement->copyFastMathFlags(&I);
 

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp b/llvm/tools/llvm-reduce/deltas/ReduceOperands.cpp
index 348421b8d6997..98d068f6b1344 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 7bf3eb1a07a1a..93556b7e91795 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);
         }


        


More information about the llvm-commits mailing list