[llvm] r181927 - Implement PPC counter loops as a late IR-level pass

Ulrich Weigand Ulrich.Weigand at de.ibm.com
Thu May 16 07:43:22 PDT 2013


Hal Finkel <hfinkel at anl.gov> wrote:

> Implement PPC counter loops as a late IR-level pass

This seems to have introduced two new test-suite failures in 32-bit mode:
SingleSource/Benchmarks/Adobe-C++/simple_types_constant_folding
SingleSource/Benchmarks/Adobe-C++/simple_types_loop_invariant

Looking at the first one, it crashes on the line:

        ::fill(data64, data64+SIZE, int64_t(init_value));

where the variables are:

const int SIZE  = 8000;
double init_value = 1.0;
int64_t data64[SIZE];

The generated assembly for this line is:

   0x10002f14 <+8536>:  lis     r3,4100
   0x10002f18 <+8540>:  li      r4,2000
   0x10002f1c <+8544>:  li      r30,0
   0x10002f20 <+8548>:  lfd     f1,-6872(r3)
   0x10002f24 <+8552>:  mtctr   r4
   0x10002f28 <+8556>:  bl      0x1002cdc0 <__fixdfdi at plt>
   0x10002f2c <+8560>:  lis     r5,4102
   0x10002f30 <+8564>:  addi    r5,r5,22096
   0x10002f34 <+8568>:  mr      r6,r5
   0x10002f38 <+8572>:  stwux   r3,r6,r30
   0x10002f3c <+8576>:  addi    r30,r30,32
   0x10002f40 <+8580>:  stw     r4,12(r6)
   0x10002f44 <+8584>:  stw     r3,8(r6)
   0x10002f48 <+8588>:  stw     r4,4(r6)
   0x10002f4c <+8592>:  stw     r4,28(r6)
   0x10002f50 <+8596>:  stw     r3,24(r6)
   0x10002f54 <+8600>:  stw     r4,20(r6)
   0x10002f58 <+8604>:  stw     r3,16(r6)
   0x10002f5c <+8608>:  bdnz    0x10002f34 <main(int, char**)+8568>

Note how 0x1002f24 sets up CTR to hold the loop counter, but this is
then clobbered by the function call to __fixdfdi.

> The most fragile part of this new implementation is that interfering uses
of
> the counter register must be detected on the IR level (and, on PPC, this
also
> includes any indirect branches in addition to function calls).

Does this maybe need anything special to detect libgcc helper function
calls?


Bye,
Ulrich




More information about the llvm-commits mailing list