UPDATE: I’ve put out an open-source licensed framework of Unreal Engine plugins called NEXUS. It contains a collection of validators in it’s Fixers plugin including one for this very problem!
WARNING: This has sphagetti BP, it hurts, I know, but its here to demonstrate a problem, and a solution. So let’s just accept it for what it is and move on. This is more of a PSA post, take it or leave it.
Problem
In the above example, the Break Vector node has its output pins accessed at multiple stages of the graph’s execution (both Branch nodes). This causes the Pure node to have its output evaluated multiple times when accessed throughout the graph; thus, a validator configured to barf on this would show a message similar to:
Break Vector MultiPin Pure Nodes actually get called for each connected pin output.
Now, as some endeavouring engineers might suggest, you can select the nodes in question and use the ‘Collapse To Function’ option from the context menu; this creates overhead in yet another BP method, which involves wrapping another method (so it’s not a zero-cost solution).
Initially, I thought I could be clever and simply create a few quick nodes that were BlueprintCallable and had their outputs accessible from further down the graph without incurring the cost of reevaluation.

This didn’t sit right with me; this was a really dumb problem to keep running into, and I kept thinking that someone at Epic would not have let this be the answer. This should have been a solved problem already.
Solution
I can’t be sure when or how I noticed the `Show Exec pins` entry in the context menu on Pure nodes, but it was the answer I had been looking for all along. A simple built-in solution for when you want to control the execution flow of a Pure node.

We can now choose the point at which the node is evaluated and its outputs are cached. Under the hood, the node is no longer treated as a Pure node (despite the visual appearance). It functions as any other BlueprintCallable node.

NOTE: You should evaluate your graphs logic incase it counts on the reevaluation property of accessing a Pure nodes output multiple times. In this case you should most likely copying the Pure node and drawing from the copies where needed to better represent your logic.
TLDR
Pure node outputs are not cached and are evaluated each time they are accessed via the pin. Using the Exec pins changes the behaviour to match that of a BlueprintCallable and allows for the outputs to be cached and reused.
