only use 48-bit lba when necessary
Quoted 6 lines
Quoted 5 lines
The operands of & can be evaluated in any order, while && requires
left-to-right and does not evaluate the right operand if the left one is false. Only the simplest cases could possibly generate the same code.
Quoted 7 lines
The code must execute AS IF the right operand is only evaluated if the left operand is true.
If an optimizer can prove that evaluating an operand has no side effects (which a halfway-decent optimizer can usually do for simple expressions), then it is free to evaluate it in any way that will produce the same result.
No, that's not quite right. Take this code for example:
struct foo *bar;
if (bar && bar->baz == 6) /* something */;
If bar were zero, then evaluating the right side of the && would cause a fault. (This is not a side effect.)
So the AS IF part if your statement is right but you have to consider
more than just side effects.
--
Chuck