diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-09-21 21:35:23 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-09-21 21:35:23 +0000 | 
| commit | b121ae1cec615e622752baeeb068370ccfeaeac7 (patch) | |
| tree | 9ee49c19507f5330925436b4cae51db1db5a4578 /llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp | |
| parent | 89dd63733a59a20e8246b413f79d07f11a1fb3e7 (diff) | |
| download | bcm5719-llvm-b121ae1cec615e622752baeeb068370ccfeaeac7.tar.gz bcm5719-llvm-b121ae1cec615e622752baeeb068370ccfeaeac7.zip | |
Do not fold (X + C1 != C2) if there are other users of the add.  Doing
this transformation used to take a loop like this:
int Array[1000];
void test(int X) {
  int i;
  for (i = 0; i < 1000; ++i)
    Array[i] += X;
}
Compiled to LLVM is:
no_exit:                ; preds = %entry, %no_exit
        %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ]            ; <uint> [#uses=2]
        %tmp.4 = getelementptr [1000 x int]* %Array, int 0, uint %indvar                ; <int*> [#uses=2]
        %tmp.7 = load int* %tmp.4               ; <int> [#uses=1]
        %tmp.9 = add int %tmp.7, %X             ; <int> [#uses=1]
        store int %tmp.9, int* %tmp.4
***     %indvar.next = add uint %indvar, 1              ; <uint> [#uses=2]
***     %exitcond = seteq uint %indvar.next, 1000               ; <bool> [#uses=1]
        br bool %exitcond, label %return, label %no_exit
and turn it into a loop like this:
no_exit:                ; preds = %entry, %no_exit
        %indvar = phi uint [ 0, %entry ], [ %indvar.next, %no_exit ]            ; <uint> [#uses=3]
        %tmp.4 = getelementptr [1000 x int]* %Array, int 0, uint %indvar                ; <int*> [#uses=2]
        %tmp.7 = load int* %tmp.4               ; <int> [#uses=1]
        %tmp.9 = add int %tmp.7, %X             ; <int> [#uses=1]
        store int %tmp.9, int* %tmp.4
***     %indvar.next = add uint %indvar, 1              ; <uint> [#uses=1]
***     %exitcond = seteq uint %indvar, 999             ; <bool> [#uses=1]
        br bool %exitcond, label %return, label %no_exit
Note that indvar.next and indvar can no longer be coallesced.  In machine
code terms, this patch changes this code:
.LBBtest_1:     # no_exit
        mov %EDX, OFFSET Array
        mov %ESI, %EAX
        add %ESI, DWORD PTR [%EDX + 4*%ECX]
        mov %EDX, OFFSET Array
        mov DWORD PTR [%EDX + 4*%ECX], %ESI
        mov %EDX, %ECX
        inc %EDX
        cmp %ECX, 999
        mov %ECX, %EDX
        jne .LBBtest_1  # no_exit
into this:
.LBBtest_1:     # no_exit
        mov %EDX, OFFSET Array
        mov %ESI, %EAX
        add %ESI, DWORD PTR [%EDX + 4*%ECX]
        mov %EDX, OFFSET Array
        mov DWORD PTR [%EDX + 4*%ECX], %ESI
        inc %ECX
        cmp %ECX, 1000
        jne .LBBtest_1  # no_exit
We need better instruction selection to get this:
.LBBtest_1:     # no_exit
        add DWORD PTR [Array + 4*%ECX], EAX
        inc %ECX
        cmp %ECX, 1000
        jne .LBBtest_1  # no_exit
... but at least there is less register juggling
llvm-svn: 16473
Diffstat (limited to 'llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp')
0 files changed, 0 insertions, 0 deletions

