Out-of-order execution always has the same answer that would occur from a single threaded perspective. There's no "thinks the result would be the same" about it - the result is the same.
You get into trouble when you:
1) assuming ordering to external peripherals (e.g., memory mapped I/O)
2) assuming stores/loads are happening in a specific order (e.g., other threads either pre-empt or are simultaneously running) causing data races
Your response makes it sound like a compiler could reorder functions like:
x=5;
x=add(x,5);
x=multiply(x,10);
printf("%d", x);
and you could expect to get either 100 or 55 as an answer if you didn't use fences. That's not true. The answer will always be right (100) no matter what OOO, speculative execution, etc happen.