--- /dev/null
+; Test that llvm-reduce produces the same output when starting at a higher granularity level.
+;
+; RUN: llvm-reduce --delta-passes=functions,instructions --starting-granularity-level=2 --test FileCheck --test-arg --check-prefixes=CHECK-ALL,CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: cat %t | FileCheck -implicit-check-not=uninteresting --check-prefixes=CHECK-ALL,CHECK-FINAL %s
+
+define i32 @uninteresting1() {
+entry:
+ ret i32 0
+}
+
+; CHECK-ALL-LABEL: interesting()
+define i32 @interesting() {
+entry:
+ ; CHECK-INTERESTINGNESS: call i32 @interesting()
+ %call2 = call i32 @interesting()
+ %call = call i32 @uninteresting1()
+ ret i32 5
+}
+
+; CHECK-FINAL-NEXT: entry:
+; CHECK-FINAL-NEXT: %call2 = call i32 @interesting()
+; CHECK-FINAL-NEXT: ret i32 5
+; CHECK-FINAL-NEXT: }
+
+define i32 @uninteresting2() {
+entry:
+ ret i32 0
+}
+
+declare void @uninteresting3()
"abort-on-invalid-reduction",
cl::desc("Abort if any reduction results in invalid IR"));
+static cl::opt<unsigned int> StartingGranularityLevel(
+ "starting-granularity-level",
+ cl::desc("Number of times to divide chunks prior to first test"));
+
void writeOutput(ReducerWorkItem &M, llvm::StringRef Message);
bool isReduced(ReducerWorkItem &M, TestRunner &Test,
std::vector<Chunk> ChunksStillConsideredInteresting = {{1, Targets}};
std::unique_ptr<ReducerWorkItem> ReducedProgram;
+ for (unsigned int Level = 0; Level < StartingGranularityLevel; Level++) {
+ increaseGranularity(ChunksStillConsideredInteresting);
+ }
+
bool FoundAtLeastOneNewUninterestingChunkWithCurrentGranularity;
do {
FoundAtLeastOneNewUninterestingChunkWithCurrentGranularity = false;