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