[LLVMdev] Aliasing bug or feature?

Eli Friedman eli.friedman at gmail.com
Thu Mar 1 13:14:41 PST 2012


On Thu, Mar 1, 2012 at 1:04 PM, Sergei Larin <slarin at codeaurora.org> wrote:
> Hello everyone,
>
>  I am working on some changes to the Hexagon VLIW PreRA scheduler, and as a
> part of it need to test aliasing properties of two instruction.
> What it boils down to is the following code:
>
> char a[20];
> char s;
> char *p, *q; // p == &a[0]; q == &s;
>
> void test()
> {
>  register char reg;
>
>  s = 0;
>  reg = p[0] + p[1];
>  s = q[0] + reg;
>
>  return;
> }
>
> When I ask the question whether "&s" and "&q[0]" may potentially alias, I
> got negative affirmation.
> In the full test (not presented) they indeed may and do in fact alias,
> resulting in incorrect VLIW schedule.
>
> My question - is it a feature or a bug :)
>
> Here is somewhat more info:
>
> Before lowering begins:
> *** IR Dump After Remove sign extends ***
> define void @test() nounwind {
> entry:
>  store i8 0, i8* @s, align 1, !tbaa !0
>  %0 = load i8** @p, align 4, !tbaa !2
>  %1 = load i8* %0, align 1, !tbaa !0
>  %conv = zext i8 %1 to i32
>  %arrayidx1 = getelementptr inbounds i8* %0, i32 1
>  %2 = load i8* %arrayidx1, align 1, !tbaa !0
>  %conv2 = zext i8 %2 to i32
>  %3 = load i8** @q, align 4, !tbaa !2 <<< Can this load be bypassed by the
> store below?
>  %4 = load i8* %3, align 1, !tbaa !0
>  %conv5 = zext i8 %4 to i32
>  %add = add i32 %conv2, %conv
>  %add7 = add i32 %add, %conv5
>  %conv8 = trunc i32 %add7 to i8
>  store i8 %conv8, i8* @s, align 1, !tbaa !0 <<< Can this store bypass the
> above load?

Err, are you sure you're asking the right question?  Given the loads
you're pointing at, you're asking whether &s and &q alias.

-Eli




More information about the llvm-dev mailing list