@@ -2891,7 +2891,14 @@ BasicBlock *GradientUtils::getReverseOrLatchMerge(BasicBlock *BB,
2891
2891
// reverse of the branching block.
2892
2892
if (rB == origLI->getHeader ())
2893
2893
return reverseBlocks[getNewFromOriginal (B)].front ();
2894
- return origToNewForward[rB];
2894
+ auto found = origToNewForward.find (rB);
2895
+ if (found == origToNewForward.end ()) {
2896
+ llvm::errs () << *newFunc << " \n " ;
2897
+ llvm::errs () << *origLI << " \n " ;
2898
+ llvm::errs () << *rB << " \n " ;
2899
+ }
2900
+ assert (found != origToNewForward.end ());
2901
+ return found->second ;
2895
2902
};
2896
2903
2897
2904
// TODO clone terminator
@@ -2900,20 +2907,36 @@ BasicBlock *GradientUtils::getReverseOrLatchMerge(BasicBlock *BB,
2900
2907
if (notForAnalysis.count (B)) {
2901
2908
NB.CreateUnreachable ();
2902
2909
} else if (auto BI = dyn_cast<BranchInst>(TI)) {
2903
- if (BI->isUnconditional ())
2904
- NB.CreateBr (remap (BI->getSuccessor (0 )));
2905
- else
2906
- NB.CreateCondBr (lookupM (getNewFromOriginal (BI->getCondition ()),
2907
- NB, available),
2908
- remap (BI->getSuccessor (0 )),
2909
- remap (BI->getSuccessor (1 )));
2910
+ if (BI->isUnconditional ()) {
2911
+ if (notForAnalysis.count (BI->getSuccessor (0 )))
2912
+ NB.CreateUnreachable ();
2913
+ else
2914
+ NB.CreateBr (remap (BI->getSuccessor (0 )));
2915
+ } else {
2916
+ if (notForAnalysis.count (BI->getSuccessor (0 ))) {
2917
+ if (notForAnalysis.count (BI->getSuccessor (1 ))) {
2918
+ NB.CreateUnreachable ();
2919
+ } else {
2920
+ NB.CreateBr (remap (BI->getSuccessor (1 )));
2921
+ }
2922
+ } else if (notForAnalysis.count (BI->getSuccessor (1 ))) {
2923
+ NB.CreateBr (remap (BI->getSuccessor (0 )));
2924
+ } else {
2925
+ NB.CreateCondBr (
2926
+ lookupM (getNewFromOriginal (BI->getCondition ()), NB,
2927
+ available),
2928
+ remap (BI->getSuccessor (0 )), remap (BI->getSuccessor (1 )));
2929
+ }
2930
+ }
2910
2931
} else if (auto SI = dyn_cast<SwitchInst>(TI)) {
2911
2932
auto NSI = NB.CreateSwitch (
2912
2933
lookupM (getNewFromOriginal (BI->getCondition ()), NB,
2913
2934
available),
2914
2935
remap (SI->getDefaultDest ()));
2915
2936
for (auto cas : SI->cases ()) {
2916
- NSI->addCase (cas.getCaseValue (), remap (cas.getCaseSuccessor ()));
2937
+ if (!notForAnalysis.count (cas.getCaseSuccessor ()))
2938
+ NSI->addCase (cas.getCaseValue (),
2939
+ remap (cas.getCaseSuccessor ()));
2917
2940
}
2918
2941
} else {
2919
2942
assert (isa<UnreachableInst>(TI));
0 commit comments