[LLVMdev] Proposal for Poison Semantics
David Majnemer
david.majnemer at gmail.com
Wed Feb 4 10:24:26 PST 2015
On Wed, Feb 4, 2015 at 9:09 AM, John Regehr <regehr at cs.utah.edu> wrote:
> Hi all, sorry to come late to the party. This is a great thread. I wanted
> to toss out an example I ran across the other day that seems somewhat
> interesting. We start with this C program that executes no UB:
>
> int foo(int x1, int x2) {
> return
> ((x2 > 0) && (x1 > (2147483647 - x2))) ||
> (x1 && (x2 < 0));
> }
>
> int main(void) {
> printf("%x\n", foo(1, -770027279));
> return 0;
> }
>
> Clang+LLVM turns foo() into this:
>
> define i32 @foo(i32 %x1, i32 %x2) #0 {
> %1 = icmp sgt i32 %x2, 0
> %2 = sub nsw i32 2147483647, %x2
> %3 = icmp slt i32 %2, %x1
> %or.cond = and i1 %1, %3
> br i1 %or.cond, label %6, label %4
>
> ; <label>:4 ; preds = %0
> %5 = icmp slt i32 %x2, 0
> %not. = icmp ne i32 %x1, 0
> %. = and i1 %5, %not.
> br label %6
>
> ; <label>:6 ; preds = %4, %0
> %7 = phi i1 [ true, %0 ], [ %., %4 ]
> %8 = zext i1 %7 to i32
> ret i32 %8
> }
>
> In the semantics described by the LangRef, my interpretation of the
> execution is this:
>
> %1 = false
> %2 = poison
> %3 = poison
> %or.cond = poison
> ... the br goes either way or both ways or something ...
> %5 = true
> %not. = true
> %. = true
> %7 = phi true, true
>
> So all is good despite the non-deterministic execution.
>
> In the proposed new model, we don't have to branch on poison since
> %or.cond is completely determined by its false argument and is therefore
> false. Does that all sound right?
Under the semantics described by the RFC, yes.
>
>
> John
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150204/171a4ed3/attachment.html>
More information about the llvm-dev
mailing list