Al Viro <v...@zeniv.linux.org.uk> writes:

> On Sun, Jun 25, 2017 at 04:44:09PM -0500, Segher Boessenkool wrote:
>
>> Do you have a short stand-alone testcase?  4.6 is ancient, of course, but
>> the actual problem may still exist in more recent compilers (if it _is_
>> a compiler problem; if it's not, you *really* want to know :-) )
>
> Enjoy.  At least 6.3 doesn't step into that.  Look for mtctr in the resulting
> asm...
>
> cat <<'EOF' >a.c
...

I pointed creduce at that and got the version below, which I'm pretty
sure still exhibits the weird mtctr behaviour.

cheers

# cat input.c
struct {
  void *iov_base;
  unsigned iov_len;
} * c;
long v;
void *a;
int b;
unsigned bar();
foo(unsigned p1) {
  unsigned d, e = p1;
  if (p1 == 0)
    goto out;
  if (p1 > 4)
    goto out;
  if (__builtin_expect(!!(0, v && a), 1))
    e = bar();
  if (e)
    barf(e);
  if (e)
    goto out;
  d = 0;
  for (; d < p1; d++) {
    int f = c[d].iov_len;
    if (__builtin_expect(c[d].iov_base && f, 0))
      b = 4;
  }
out:;
}

$ cat output.s 
        .file   "input.c"

 # rs6000/powerpc options: -mcpu=powerpc -msdata=data -G 8
 # GNU C (GCC) version 4.6.3 (powerpc64-linux)
 #      compiled by GNU C version 4.3.2, GMP version 4.3.2, MPFR version 2.4.2, 
MPC version 0.8.2
 # ...

 # Compiler executable checksum: 4b51a6b899110d06c9e3310ac66ad26c

        .section        ".text"
        .align 2
        .globl foo
        .type   foo, @function
foo:
        cmpwi 0,3,0      # tmp169, p1
        stwu 1,-16(1)    #,,
        mflr 0   #,
        stw 0,20(1)      #,
        beq- 0,.L9       #
        cmplwi 7,3,4     #, tmp170, p1
        bgt- 7,.L9       #
        lis 9,v@ha       # tmp172,
        lwz 0,v@l(9)     # v, v
        cmpwi 7,0,0      #, tmp174, v
        beq- 7,.L3       #
        lis 9,a@ha       # tmp176,
        lwz 0,a@l(9)     # a, a
        cmpwi 7,0,0      #, tmp178, a
        beq- 7,.L3       #
        bl bar   #
        cmpwi 0,3,0      # tmp179, e
        beq+ 0,.L4       #
.L3:
        bl barf  #
        b .L9    #
.L4:
        lis 8,0x2000     #,
        lis 9,c@ha       # tmp181,
        mtctr 8  # tmp192,
        lwz 11,c@l(9)    # c, c.3
        lis 10,b@ha      # tmp190,
        li 9,0   # ivtmp.12,
        li 0,4   # tmp191,
.L6:
        lwzx 7,11,9      # MEM[base: c.3_14, index: ivtmp.12_25, offset: 0B], 
MEM[base: c.3_14, index: ivtmp.12_25, offset: 0B]
        add 8,11,9       # tmp182, c.3, ivtmp.12
        lwz 8,4(8)       # MEM[base: D.1310_21, offset: 4B], D.1287
        cmpwi 7,7,0      #, tmp184, MEM[base: c.3_14, index: ivtmp.12_25, 
offset: 0B]
        beq+ 7,.L5       #
        cmpwi 7,8,0      #, tmp185, D.1287
        beq+ 7,.L5       #
        stw 0,b@l(10)    # b, tmp191
.L5:
        addi 9,9,8       # ivtmp.12, ivtmp.12,
        bdnz .L6         #
.L2:
.L9:
        lwz 0,20(1)      #,
        addi 1,1,16      #,,
        mtlr 0   #,
        blr      #
        .size   foo,.-foo
        .globl b
        .globl a
        .globl v
        .globl c
        .section        .sbss,"aw",@nobits
        .align 2
        .type   b, @object
        .size   b, 4
b:
        .zero   4
        .type   a, @object
        .size   a, 4
a:
        .zero   4
        .type   v, @object
        .size   v, 4
v:
        .zero   4
        .type   c, @object
        .size   c, 4
c:
        .zero   4
        .ident  "GCC: (GNU) 4.6.3"
        .section        .note.GNU-stack,"",@progbits

Reply via email to