[LLVMdev] Is shortening a load a bug?
bagel
bagel99 at gmail.com
Thu Sep 11 17:17:39 PDT 2014
On 09/11/2014 05:33 PM, Quentin Colombet wrote:
> Hi Brian,
>
> On Sep 11, 2014, at 3:03 PM, Bagel <bagel99 at gmail.com> wrote:
>
>> When the IR specifies a 32 bit load can it be changed to a narrower
>> load? What if the load is from memory (e.g. a peripheral) that only
>> supports 32-bit access? Consider the following IR: ---- target datalayout
>> = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32" target
>> triple = "thumbv7m-unknown-unknown" @f = external global i32 define
>> zeroext i8 @bar() nounwind { L.0: %rv.0 = alloca i8 %0 = load i32* @f %1
>> = trunc i32 %0 to i8 ret i8 %1 } ---- Which for the arm cortex-m3
>> generates: ---- bar: movw r0, :lower16:f movt r0, :upper16:f ldrb r0,
>> [r0] bx lr ---- Although we are only interested in low 8-bits, the load
>> MUST be a 32-bit load.
>
> I believe this is correct. As long as loading an i8 is legal, I do not
> think we should bother loading the whole 32 bits.
>
> Why do you think this is a bug?
>
> Thanks, -Quentin
The phrase "As long as loading an i8 is legal" is the whole point. What if it
isn't? How do I specify that (should of specifying the load as volatile,
which is overkill)? As an author of a front end, I want to know what the
contract is when I say load 32-bits? When I say load 32-bits I mean load 32-bits.
I think it's a bug because there is no good way do avoid it and it breaks
device drivers.
brian
More information about the llvm-dev
mailing list