Index: lib/Transforms/Scalar/TailRecursionElimination.cpp =================================================================== --- lib/Transforms/Scalar/TailRecursionElimination.cpp +++ lib/Transforms/Scalar/TailRecursionElimination.cpp @@ -523,7 +523,7 @@ Value *ReturnedValue = nullptr; for (Function::iterator BBI = F->begin(), E = F->end(); BBI != E; ++BBI) { - ReturnInst *RI = dyn_cast(BBI->getTerminator()); + ReturnInst *RI = dyn_cast_or_null(BBI->getTerminator()); if (RI == nullptr || RI == IgnoreRI) continue; // We can only perform this transformation if the value returned is Index: test/Transforms/TailCallElim/inf-recursion.ll =================================================================== --- test/Transforms/TailCallElim/inf-recursion.ll +++ test/Transforms/TailCallElim/inf-recursion.ll @@ -31,3 +31,27 @@ } declare x86_fp80 @fabsl(x86_fp80 %f) + + +; Don't crash while transforming a function with infinite recursion. + +define i32 @PR22704(i1 %bool) { +entry: + br i1 %bool, label %t, label %f + +t: + %call1 = call i32 @PR22704(i1 1) + br label %return + +f: + %call = call i32 @PR22704(i1 1) + br label %return + +return: + ret i32 0 + +; CHECK-LABEL: @PR22704( +; CHECK: %bool.tr = phi i1 [ %bool, %entry ], [ true, %t ], [ true, %f ] +; CHECK: br i1 %bool.tr, label %t, label %f +} +