It allows for the code to appear here:
if(a) __local_irq_save(x); else ...;
// -> if(a) do { .. } while(0); else ...;
If they simply used a { .. }
you would get
if(a) { ... }; else ...;
The else would not belong to any if
anymore, because the semicolon would be the next statement and separate the else
from the preceeding if
. A compile error would occur.