...
original loop
|
|---|
for (int i = init, i < limit; i += stride) { // loop with array range check ... if (scale*i + offset < a.length) { // array range check <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="df1eefd4db97cc24-4c171911-43f74a52-a637ab80-cf3f52acc90b67bf540adb5b"><ac:plain-text-body><![CDATA[ ... a[scale*i+offset] ... ]]></ac:plain-text-body></ac:structured-macro> } else raise_uncommon_trap(); ... } |
after loop predication
|
|---|
if ( scale * imax + offset < a.length ) { // loop predicate. imax is the maximum value of i where init <= i < limit for (int i = init, i < limit; i += stride) { // loop without array range check ... <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="0cd2fc9b29500107-a63e3741-4ad442d5-9735962c-c02258d2b9cfb0ed044769b7"><ac:plain-text-body><![CDATA[ ... a[scale*i+offset] ... ]]></ac:plain-text-body></ac:structured-macro> ... } } else raise_uncommon_trap();
|
...
elimination includes null check elimination and array check elimination, etc.
Loop Predication Advantages