After JDK-8175554 it has become clear that the combination of G1UpdateRSOrPushRefClosure and G1ParPushRefClosure does almost exactly the same thing as G1ParScanClosure.
The only difference is that the latter need to update a flag whether it encountered a reference into the collection set during scanning a card. This extra write should be cheap.
Replacing G1UpdateRSOrPushRefClosure and G1ParPushRefClosure with G1ParScanClosure would remove a lot code.
Verify that there are no performance regressions by adding the flag to G1ParScanClosure and using it in place of the other two closures.