The Volatile Parameter (GNAT User’s Guide for Native Platforms)

#### 10.6.2 The `Volatile` Parameter ¶

Compiler optimizations in the presence of Inline Assembler may sometimes have unwanted effects. For example, when an `Asm` invocation with an input variable is inside a loop, the compiler might move the loading of the input variable outside the loop, regarding it as a one-time initialization.

If you don’t want this to happen, you can disable such optimizations by setting the `Volatile` parameter to `True`; for example:

>     Asm ("movl %0, %%ebx" & LF & HT &
>          "movl %%ebx, %1",
>          Outputs  => Unsigned_32'Asm_Output ("=g", Var_Out),
>          Inputs   => Unsigned_32'Asm_Input  ("g", Var_In),
>          Clobber  => "ebx",
>          Volatile => True);

By default, `Volatile` is set to `False` unless there is no `Outputs` parameter.

Although setting `Volatile` to `True` prevents unwanted optimizations, it also disables other optimizations that might be important for efficiency. In general, you should set `Volatile` to `True` only if the compiler’s optimizations have created problems.