diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -540,7 +540,10 @@ } // This section is in both; advance and print out any before-only // until we get to it. - while (*BI != *AI) { + // It's possible that this section has moved to be later than before. This + // will mess up printing most blocks side by side, but it's a rare case and + // it's better than crashing. + while (BI != BE && *BI != *AI) { HandlePotentiallyRemovedData(*BI); ++BI; } @@ -550,7 +553,8 @@ const T &AData = AFD.find(*AI)->getValue(); const T &BData = BFD.find(*AI)->getValue(); HandlePair(&BData, &AData); - ++BI; + if (BI != BE) + ++BI; ++AI; } diff --git a/llvm/test/Other/ChangePrinters/print-changed-diff-block-ordering-changed.ll b/llvm/test/Other/ChangePrinters/print-changed-diff-block-ordering-changed.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Other/ChangePrinters/print-changed-diff-block-ordering-changed.ll @@ -0,0 +1,20 @@ +; RUN: opt -passes=jump-threading %s -disable-output --print-changed=diff 2>&1 | FileCheck %s + +; CHECK: IR Dump After JumpThreadingPass + +define void @f(i1 %0) { + br i1 %0, label %5, label %2 + +2: ; preds = %1 + br i1 false, label %b, label %3 + +3: ; preds = %2 + %4 = call i64 null() + br label %b + +b: ; preds = %3, %2 + br label %5 + +5: ; preds = %b, %1 + ret void +}