| Exercise a method containing a `try' statement with several |
| instructions with a `finally' clause but without any `catch' block, |
| enclosed in a loop. |
| |
| When dx processes an integer division (or modulo) enclosing a `try' |
| block and whose result is assigned to a local value, it is smart |
| enough not to emit a `div-int' (or `rem-int') instruction when the |
| divisor is non-null, as it wouldn't be used. However, dx is not |
| that clever regarding exception handling: if the divisor is known to |
| be non-null at compile-time (as is the case in this test), it will |
| still emit a block with the exception catching and rethrowing |
| mechanism, even if it is not used. |
| |
| This used to be a problem for a `try' block followed by a `finally' |
| clause but with no `catch' block: in that case, the generated Dex code |
| item would list zero catch block for this method (see |
| art::CodeItem::tries_size_) and the optimizing compiler would have no |
| clue that it contains a `try' statement, which it cannot optimize |
| (yet). With no hint that this method might contain one (or several) |
| special block(s) related to `catch'-less `try' statement(s), the |
| optimizing compiler considered this (these) as dead block(s) and |
| improperly tried to remove its (their) instructions, sometimes |
| removing instructions used by others instructions, thus triggering |
| assertions. The optimizing compiler was thus adjusted to remove these |
| instructions in a proper fashion, by removing them as users first, and |
| then by suppressing them for good. |