By the way, CLANG 2.9 produce same behavior as my front-end:<br><br>Try clang<br><br>clang -O2 -S -emit-llvm rec.c -o rec.ll<br><br>on following example:<br><br>/*--- Recurrence recognition.  */<br><br>static int expect[] = {<br>
    1, 1, 1, 1          /* t0:  0 - 3  */<br>};<br><br>extern void check() ;<br><br>#define N sizeof(expect) / sizeof(int)<br><br>static int result[N];<br><br>static void<br>t0(int n)<br>{<br>    int i;<br>    for (i=0; i<n; i++)<br>
    result[i+1] = result[i];<br>}<br><br>void<br>test() {<br>    result[0] = 1;<br>    t0(3);<br><br>    check(result, expect, N);<br>}<br><br>LL file generated is:<br>; ModuleID = 'ka50.c'<br>target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"<br>
target triple = "x86_64-unknown-linux-gnu"<br><br>@result = internal global [4 x i32] zeroinitializer, align 16<br>@expect = internal global [4 x i32] [i32 1, i32 1, i32 1, i32 1], align 16<br><br>define void @test() nounwind {<br>
  store i32 1, i32* getelementptr inbounds ([4 x i32]* @result, i64 0, i64 0), align 16, !tbaa !0<br>  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast (i32* getelementptr inbounds ([4 x i32]* @result, i64 0, i64 1) to i8*), i8* bitcast ([4 x i32]* @result to i8*), i64 12, i32 4, i1 false) nounwind<br>
  tail call void (...)* @check(i32* getelementptr inbounds ([4 x i32]* @result, i64 0, i64 0), i32* getelementptr inbounds ([4 x i32]* @expect, i64 0, i64 0), i64 4) nounwind<br>  ret void<br>}<br><br>declare void @check(...)<br>
<br>Then assembly produced is:<br><br>test:                                   # @test<br>.Leh_func_begin0:<br># BB#0:<br>    pushq    %rbp<br>.Ltmp0:<br>    movq    %rsp, %rbp<br>.Ltmp1:<br>    movl    $1, result(%rip)<br>
    movl    result+8(%rip), %eax<br>    movl    %eax, result+12(%rip)<br>    movq    result(%rip), %rax<br>    movq    %rax, result+4(%rip)<br>    movl    $result, %edi<br>    movl    $expect, %esi<br>    movl    $4, %edx<br>
    xorb    %al, %al<br>    callq    check<br>    popq    %rbp<br>    ret<br><br>As you can see resul+8 is read before being written and thus the problem.<br>Hope that clarifies the problem.<br><br><br><div class="gmail_quote">
2011/12/9 Seb <span dir="ltr"><<a href="mailto:babslachem@gmail.com">babslachem@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im"><br><br><div class="gmail_quote">2011/12/9 Joerg Sonnenberger <span dir="ltr"><<a href="mailto:joerg@britannica.bec.de" target="_blank">joerg@britannica.bec.de</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<div>On Fri, Dec 09, 2011 at 10:03:37AM +0100, Seb wrote:<br>
> I think my explanation is not clear, my front-end did NOTt generate<br>
> 'llvm.memcpy' it generate LL code that after use of LLVM 'opt' get<br>
> transformed by 'loop-idom' pass into an 'llvm.memcpy' for an overlapping<br>
> loop:<br>
><br>
> static void<br>
> t0(int n)<br>
> {<br>
>     int i;<br>
>     for (i=0; i<n; i++)<br>
>     result[i+1] = result[i];<br>
> }<br>
<br>
</div>Do you really want to assign result[0] to everything?<br>
<br>
I wonder how much work it is to each the loop-idiom pass to handle this<br>
and the case of reverse indices correctly, if result is char *. E.g.<br>
create either memset or memmove...<br>
<span><font color="#888888"><br>
Joerg</font></span><br></blockquote><div> </div></div></div>This thread is not to discuss how relevant this example is. I just would like to know:<br>a) If people think that adding an option to disable a specific pass is useful.<br>

b) To discuss implementation details (disable all pass invocations, what to do when there are dependencies between passes invocations).<br>c) If I implement it, what's the process to get my change merge with trunk.<br>

<br>Now for my own purpose, I commented out loop-idiom invocation in LLVM 2.9 sources and it worked well. I just wanted to develop something generic that could benefit LLVM community.<br><br>Best Regards<span class="HOEnZb"><font color="#888888"><br>
Seb<br>
</font></span></blockquote></div><br>