[llvm-dev] Potentially unsafe loop optimization
Richard Kenner via llvm-dev
llvm-dev at lists.llvm.org
Wed Feb 17 16:39:55 PST 2021
> Executing the add instruction that results in an unsigned wrap despite
> the nuw flag is not an undefined instruction, but results in a
> 'poison' value. Only certain uses of a poison value results in
> undefined behaviour. See
> https://llvm.org/docs/LangRef.html#poison-values for more information.
I stand corrected. But then why does the code generator view the
branch as always true?
> > loop.cond.iter: ; preds = %8
> > %6 = load i8, i8* %c, align 1, !tbaa !5
> > %loop.iter.cond = icmp eq i8 %6, -1
> > br i1 %loop.iter.cond, label %loop.exit, label %loop.iter
> >
> > loop.iter: ; preds = %loop.cond.iter
> > %next.loop.var = add nuw i8 %6, 1
> > store i8 %next.loop.var, i8* %c, align 1, !tbaa !5
> > br label %loop.cond
> >
> > This looks correct. We do the add after the conditional branch, so
> > we'll never see it overflow.
>
> I think this loop already has undefined behaviour. If %6 eventually
> loads the value 255, %next.loop.var will be poison.
I don't think so because if %6 is loaded with the value 255 (-1), the
branch won't go to loop.iter where the add is done. So we never get
to the add that generates poison.
Also, note that I tried this without the "nuw" on the original add and
the optimizer put that on the add instruction that it made.
More information about the llvm-dev
mailing list