It appears to be keeping the loop, but optimizing the actual workload away. I had to make some changes to make it run on godbold with a main, but it is:
opr:
mov eax, 1000000000
mov cl, 1
.LBB2_1:
dec rax
jne .LBB2_1
mov al, 1
ret
But it still is just consantly folding the function away because it knows the static input.
There is two parts to it: stop the output from being thrown away (the copy sent to DNO should work, but I’m not sure it does in all cases), and prevent the function from being constant folded and doing part of the workload at compile time. That I sdon’t see how DNO prevents.