The following is reduced from a Gelato superblock scheduling test case 
that produces similar interesting predicated code. 
See http://gcc.gelato.org/SuperblockScheduling_2fInvestigation20050401 
for the original. 
 
$ cat t.c 
extern void exit(int) __attribute__((noreturn)); 
 
char *inbuf, *outbuf; 
 
int __attribute__((noreturn)) 
foo (text_len) 
{ 
  char c; 
  int i; 
 
  for (i = 0; i < text_len; i++) 
    { 
      c = inbuf[i]; 
 
      if (c >= 'a' && c <= 'm') 
        c += 13; 
      else 
        c -= 13; 
 
      outbuf[i] = c; 
    } 
 
  exit (0); 
} 
 
$ ./cc1 -O2 t.c 
$ cat t.s 
        .file   "t.c" 
        .pred.safe_across_calls p1-p5,p16-p63 
        .text 
        .align 16 
        .global foo# 
        .proc foo# 
foo: 
        .prologue 12, 33 
        .mmi 
        .save ar.pfs, r34 
        alloc r34 = ar.pfs, 1, 4, 1, 0 
        adds r14 = -1, r32 
        .save ar.lc, r36 
        mov r36 = ar.lc 
        .mmi 
        addl r18 = @ltoffx(inbuf#), r1 
        addl r17 = @ltoffx(outbuf#), r1 
        cmp4.ge p6, p7 = 0, r32 
        ;; 
 
        .mmb 
        addp4 r14 = r14, r0 
        ld8.mov r18 = [r18], inbuf# 
        nop 0 
        .mmi 
        mov r16 = r0 
        ld8.mov r17 = [r17], outbuf# 
        .save rp, r33 
        mov r33 = b0 
        .body 
        .mib 
        nop 0 
        nop 0 
        (p6) br.cond.dpnt .L2 
        ;; 
        .mii 
        nop 0 
        mov ar.lc = r14 
        nop 0 
.L4: 
        .mmi 
        ld8 r14 = [r18] 
        ;; 
        add r14 = r16, r14 
        nop 0 
        ;; 
        .mmi 
        ld1 r14 = [r14] 
        ;; 
        nop 0 
        sxt1 r14 = r14 
        ;; 
        .mii 
        mov r15 = r14 
        adds r14 = -97, r14 
        ;; 
        zxt1 r14 = r14 
        ;; 
        .mmi 
        cmp4.ltu p6, p7 = 12, r14 
        ;; 
        (p7) adds r14 = 13, r15 
        (p6) adds r14 = -13, r15 
        ;; 
        .mii 
        nop 0 
        (p7) sxt1 r14 = r14 
        (p6) sxt1 r14 = r14 
        ;; 
        .mmi 
        nop 0 
        (p7) mov r15 = r14 
        (p6) mov r15 = r14 
        .mmi 
        ld8 r14 = [r17] 
        ;; 
        add r14 = r16, r14 
        adds r16 = 1, r16 
        ;; 
        .mib 
        st1 [r14] = r15 
        nop 0 
        br.cloop.sptk.few .L4 
.L2: 
        .mib 
        nop 0 
        mov r37 = r0 
        br.call.sptk.many b0 = exit# 
        ;; 
        break.f 0 
        ;; 
        .endp foo# 
        .common inbuf#,8,8 
        .common outbuf#,8,8 
        .ident  "GCC: (GNU) 4.1.0 20050528 (experimental)" 
 
 
Notice this incredibly charming predicated code in there: 
 
        .mmi 
        cmp4.ltu p6, p7 = 12, r14 
        ;; 
        (p7) adds r14 = 13, r15 
        (p6) adds r14 = -13, r15 
        ;; 
        .mii 
        nop 0 
        (p7) sxt1 r14 = r14 
        (p6) sxt1 r14 = r14 
        ;; 
        .mmi 
        nop 0 
        (p7) mov r15 = r14 
        (p6) mov r15 = r14

-- 
           Summary: [ia64] gcc produces really odd predicated code
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P2
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: steven at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org
GCC target triplet: ia64


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21803

Reply via email to