------- Comment #8 from ebotcazou at gcc dot gnu dot org  2010-06-11 20:34 
-------
> [...@gnu-12 gcc]$ ./xgcc -B./ -O
> /export/gnu/import/svn/gcc-test/src-trunk/gcc/testsuite/gcc.dg/pr42461.c  
> /tmp/ccmdb99H.o: In function `main':
> pr42461.c:(.text+0x22): undefined reference to `link_failure'
> collect2: ld returned 1 exit status
> [...@gnu-12 gcc]$ ./xgcc -B./ -O2
> /export/gnu/import/svn/gcc-test/src-trunk/gcc/testsuite/gcc.dg/pr42461.c  
> [...@gnu-12 gcc]$ 

At -O we run only a stand-alone DCE pass after reload, which is also after at
least one splitting pass.  Now the ia64 back-end splits calls and this drops
the RTL_PURE_CALL_P flag.  There is a comment about this in ia64.md:

;; Irritatingly, we don't have access to INSN within the split body.
;; See commentary in ia64_split_call as to why these aren't peep2.
(define_split
  [(call (mem (match_operand 0 "call_operand" ""))
         (const_int 1))
   (clobber (match_operand:DI 1 "register_operand" ""))
   (clobber (match_scratch:DI 2 ""))
   (clobber (match_scratch:DI 3 ""))]
  "reload_completed && find_reg_note (insn, REG_NORETURN, NULL_RTX)"
  [(const_int 0)]
{
  ia64_split_call (NULL_RTX, operands[0], operands[1], operands[2],
                   operands[3], true, false);
  DONE;
})

Therefore, the DCE pass doesn't see that the call is actually pure.  At -O2 we
run a DCE pass just before combine.  I'm going to adjust the testcase.


-- 


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

Reply via email to