Index: llvm/test/tools/llvm-reduce/reduce-conditionals.ll =================================================================== --- /dev/null +++ llvm/test/tools/llvm-reduce/reduce-conditionals.ll @@ -0,0 +1,39 @@ +; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=simplify-conditionals-true --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefixes=RESULT-TRUE %s < %t + +; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=simplify-conditionals-false --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t +; RUN: FileCheck --check-prefixes=RESULT-FALSE %s < %t + +; CHECK-INTERESTINGNESS-LABEL: @func( +; CHECK-INTERESTINGNESS: store i32 1, + +; RESULT-TRUE: bb0: +; RESULT-TRUE: store i32 0, ptr null, align 4 +; RESULT-TRUE-NEXT: store i32 1, ptr null, align 4 +; RESULT-TRUE-NEXT: br label %bb2 +; RESULT-TRUE-NOT: bb1 + + +; RESULT-FALSE: bb0: +; RESULT-FALSE: store i32 0, ptr null, align 4 +; RESULT-FALSE-NEXT: br label %bb2 + +; RESULT-FALSE: bb1: ; No predecessors! +; RESULT-FALSE-NEXT: store i32 1, ptr null, align 4 +; RESULT-FALSE-NEXT: br label %bb3 +define void @func(i1 %cond0, i1 %cond1) { +bb0: + store i32 0, ptr null + br i1 %cond0, label %bb1, label %bb2 + +bb1: + store i32 1, ptr null + br i1 %cond1, label %bb2, label %bb3 + +bb2: + store i32 2, ptr null + br label %bb3 + +bb3: + ret void +} Index: llvm/tools/llvm-reduce/DeltaManager.cpp =================================================================== --- llvm/tools/llvm-reduce/DeltaManager.cpp +++ llvm/tools/llvm-reduce/DeltaManager.cpp @@ -70,6 +70,8 @@ DELTA_PASS("function-bodies", reduceFunctionBodiesDeltaPass) \ DELTA_PASS("special-globals", reduceSpecialGlobalsDeltaPass) \ DELTA_PASS("aliases", reduceAliasesDeltaPass) \ + DELTA_PASS("simplify-conditionals-true", reduceConditionalsTrueDeltaPass) \ + DELTA_PASS("simplify-conditionals-false", reduceConditionalsFalseDeltaPass)\ DELTA_PASS("basic-blocks", reduceBasicBlocksDeltaPass) \ DELTA_PASS("global-values", reduceGlobalValuesDeltaPass) \ DELTA_PASS("global-objects", reduceGlobalObjectsDeltaPass) \ Index: llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.h =================================================================== --- llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.h +++ llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.h @@ -18,6 +18,8 @@ namespace llvm { void reduceUsingSimplifyCFGDeltaPass(TestRunner &Test); +void reduceConditionalsTrueDeltaPass(TestRunner &Test); +void reduceConditionalsFalseDeltaPass(TestRunner &Test); } // namespace llvm #endif Index: llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.cpp =================================================================== --- llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.cpp +++ llvm/tools/llvm-reduce/deltas/ReduceUsingSimplifyCFG.cpp @@ -13,6 +13,8 @@ #include "ReduceUsingSimplifyCFG.h" #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/Instructions.h" #include "llvm/Transforms/Utils/Local.h" using namespace llvm; @@ -32,3 +34,35 @@ outs() << "*** Reducing using SimplifyCFG...\n"; runDeltaPass(Test, reduceUsingSimplifyCFG); } +static void reduceConditionals(Oracle &O, Module &M, bool Direction) { + SmallVector ToSimplify; + + for (auto &F : M) { + for (auto &BB : F) { + auto *BR = dyn_cast(BB.getTerminator()); + if (!BR || !BR->isConditional() || O.shouldKeep()) + continue; + + if (Direction) + BR->setCondition(ConstantInt::getTrue(BR->getContext())); + else + BR->setCondition(ConstantInt::getFalse(BR->getContext())); + + ToSimplify.push_back(&BB); + } + } + + TargetTransformInfo TTI(M.getDataLayout()); + for (auto *BB : ToSimplify) + simplifyCFG(BB, TTI); +} + +void llvm::reduceConditionalsTrueDeltaPass(TestRunner &Test) { + outs() << "*** Reducing conditional branches to true...\n"; + runDeltaPass(Test, [](Oracle &O, Module &M) { reduceConditionals(O, M, true); }); +} + +void llvm::reduceConditionalsFalseDeltaPass(TestRunner &Test) { + outs() << "*** Reducing conditional branches to false...\n"; + runDeltaPass(Test, [](Oracle &O, Module &M) { reduceConditionals(O, M, false); }); +}