<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 4/4/20 12:23 PM, Mehdi AMINI via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CANF-O=Y43qyEy1WZA+m3x8CwXpiyfBxvRi74XADG87jiMEMXaA@mail.gmail.com">
      <pre class="moz-quote-pre" wrap="">On Sat, Apr 4, 2020 at 9:33 AM Akash Banerjee via llvm-dev <
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:

</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">Please consider the following C code:










*    #define SZ 2048    int main(void) {      int A[SZ];      int B[SZ];
    int i, tmp;      for (i = 0; i < SZ; i++) {        tmp = A[i];
B[i] = tmp;      }      assert(A[SZ/2] == B[SZ/2]);    }*

On running -O1 followed by -reg2mem I get the following IR:













*define dso_local i32 @main() local_unnamed_addr #0 {entry:  %A = alloca
[2048 x i32], align 16  %B = alloca [2048 x i32], align 16  %"reg2mem
alloca point" = bitcast i32 0 to i32  %arrayidx3 = getelementptr inbounds
[2048 x i32], [2048 x i32]* %A, i64 0, i64 1024  %0 = load i32, i32*
%arrayidx3, align 16  %arrayidx4 = getelementptr inbounds [2048 x i32],
[2048 x i32]* %B, i64 0, i64 1024  %1 = load i32, i32* %arrayidx4, align
16  %cmp5 = icmp eq i32 %0, %1  %conv = zext i1 %cmp5 to i32  %call = call
i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %conv)
#2  ret i32 0}*

It is my understanding that in the original C code the assert would never
fail, however in the optimized IR the assert might fail.

</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">
Reading uninitialized memory is undefined behavior in C I believe, so even
without talking about LLVM IR semantics your original program is incorrect
as soon a you read from A.</pre>
    </blockquote>
    <p>I don't think reading and writing undef values is not undefined
      behavior (in IR).<br>
    </p>
    <p>Using undef values in branches (and some other ways) is.<br>
    </p>
    <p>The "problem" here is, as Roman noted, the fact that you cannot
      assume either of these hold:</p>
    <p>  `undef != undef` or `undef == undef`.<br>
    </p>
    <p><br>
    </p>
    <p>Cheers,</p>
    <p>  Johannes<br>
    </p>
    <p><br>
    </p>
    <blockquote type="cite"
cite="mid:CANF-O=Y43qyEy1WZA+m3x8CwXpiyfBxvRi74XADG87jiMEMXaA@mail.gmail.com">
      <pre class="moz-quote-pre" wrap="">
clang ub.c -fsanitize=memory && ./a.out

*==10365==WARNING: MemorySanitizer: use-of-uninitialized-value*

    #0 0x496ce7 in main (/tmp/a.out+0x496ce7)

    #1 0x7f2e71f27bba in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x26bba)

    #2 0x41e299 in _start (/tmp/a.out+0x41e299)


SUMMARY: MemorySanitizer: use-of-uninitialized-value (/tmp/a.out+0x496ce7)
in main

Exiting


</pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
  </body>
</html>