[llvm-dev] compiler-rt, v4.0: arm\udivsi3.S broken for division by zero

Renato Golin via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 5 03:50:23 PDT 2017


On 21 March 2017 at 18:32, Peter Jakubek via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> I think the current implementation for the call "bl __aeabi_idiv0" in
> builtins\arm\udivsi3.S is broken.
> At least for the case that __aeabi_idiv0 returns. (the provided
> implementation does)
>
> Since LR is not preserved, the following JMP(lr) results in an endless loop.
>
> Or is this an intentional change of the behavior?

Hi Peter,

That is most certainly a bug. Weiming's patch was supposed to only
introduce Thumb1 code, not transform div0 into a busy loop. :)


> The file contains another implementation enabled by __ARM_ARCH_EXT_IDIV__.
> This uses "b" instead of "bl".
> (This works as in previous versions)

The comment on the patch makes that clear:

bl  __aeabi_idiv0 // due to relocation limit, can't use b.

I'm not sure why the bottom one is fine and the top one isn't, wrt.
range, but we may have to add a trampoline here.

Weiming, Saleem, comments?

cheers,
--renato


More information about the llvm-dev mailing list