https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68421

            Bug ID: 68421
           Summary: unused copy of global register variable into another
                    gpr
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: acsawdey at gcc dot gnu.org
                CC: bergner at gcc dot gnu.org
  Target Milestone: ---
            Target: ppc64le

Created attachment 36767
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36767&action=edit
test case for unused registers

There are unneeded moves from the global register variables to other registers
generated.

register zend_execute_data *execute_data __asm__("r28");
register const zend_op *opline __asm__("r29");
int ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(void)
{
 zval *op1, *op2, *result;
 op1 = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 if (__builtin_expect(!!(zval_get_type(&(*(op1))) == 4), 1)) {
  if (__builtin_expect(!!(zval_get_type(&(*(op2))) == 4), 1)) {
   do { (*(((zval*)(((char*)(execute_data)) +
((int)(opline->result.var)))))).u1.type_info = ((*(op1)).value.lval <
(*(op2)).value.lval) ? 3 : 2; } while (0);
  }
 }
 ((execute_data)->opline) = opline;
}

generates:

ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER:
        lwa 6,0(29)
        mr 8,29
        mr 10,28
        add 9,28,6
        lbz 9,8(9)
        cmpwi 7,9,4
        bne 7,.L3
        li 7,0
        lbz 9,8(7)
        cmpwi 7,9,4
        bne 7,.L3
        ldx 9,28,6
        ld 6,0(7)
        lwa 7,4(29)
        cmpd 7,9,6
        add 7,28,7
        mfcr 9,1
        rlwinm 9,9,29,1
        addi 9,9,2
        stw 9,8(7)
.L3:
        std 8,0(10)

Registers 8 and 10 are never used, 28 and 29 are used directly.

Generated by trunk 230468 on ppc64le with:

gcc -O3 -S min_unused_regs10.c

Reply via email to