<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - [ppc] unnecessary cr instructions and isel instruction"
   href="https://llvm.org/bugs/show_bug.cgi?id=25548">25548</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>[ppc] unnecessary cr instructions and isel instruction
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Backend: PowerPC
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>carrot@google.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>The following function is from 453.povray

bool Ray_In_Bound (RAY *Ray, OBJECT *Bounding_Object)
{
  OBJECT *Bound;
  INTERSECTION Local;

  for (Bound = Bounding_Object; Bound != NULL; Bound = Bound->Sibling)
  {
    Increase_Counter(stats[Bounding_Region_Tests]);

    if (!Intersection (&Local, Bound, Ray))
    {    
      if (!Inside_Object(Ray->Initial, Bound))
      {    
        return (false);
      }    
    }    
    Increase_Counter(stats[Bounding_Region_Tests_Succeeded]);
  }

  return (true);
}

When compiled with options -O2 -m64 -mvsx -mcpu=power8, I got following code:

_ZN3pov12Ray_In_BoundEPNS_10Ray_StructEPNS_13Object_StructE: #
@_ZN3pov12Ray_In_BoundEPNS_10Ray_StructEPNS_13Object_StructE
.Lfunc_begin1:
        .cfi_startproc
.Ltmp12:
        addis 2, 12, .TOC.-.Ltmp12@ha
        addi 2, 2, .TOC.-.Ltmp12@l
.Ltmp13:
        .localentry    
_ZN3pov12Ray_In_BoundEPNS_10Ray_StructEPNS_13Object_StructE, .Ltmp13-.Ltmp12
# BB#0:                                 # %entry
        mfcr 12
        mflr 0
        std 31, -8(1)
        std 0, 16(1)
        stw 12, 8(1)
        stdu 1, -336(1)
        mr 31, 1
        creqv 8, 8, 8                   // A
        std 29, 312(31)                 # 8-byte Folded Spill
        std 30, 320(31)                 # 8-byte Folded Spill
        mr 30, 4
        mr 29, 3
        std 27, 296(31)                 # 8-byte Folded Spill
        std 28, 304(31)                 # 8-byte Folded Spill
        cmpldi   30, 0
        beq      0, .LBB1_6
# BB#1:                                 # %for.body.lr.ph
        addis 3, 2, .LC0@toc@ha
        addi 28, 31, 96
        crxor 9, 9, 9                   // B
        ld 27, .LC0@toc@l(3)
        .align  4
.LBB1_2:                                # %for.body
                                        # =>This Inner Loop Header: Depth=1
        ld 3, 704(27)
        mr 4, 30
        mr 5, 29
        addi 3, 3, 1 
        std 3, 704(27)
        mr 3, 28
        bl
_ZN3pov12IntersectionEPNS_10istk_entryEPNS_13Object_StructEPNS_10Ray_StructE
        andi. 3, 3, 1 
        bc 12, 1, .LBB1_4
# BB#3:                                 # %if.then
                                        #   in Loop: Header=BB1_2 Depth=1
        mr 3, 29
        mr 4, 30
        bl _ZN3pov13Inside_ObjectEPdPNS_13Object_StructE
        cmpldi   3, 0
        beq      0, .LBB1_5
.LBB1_4:                                # %if.end.3
                                        #   in Loop: Header=BB1_2 Depth=1
        ld 3, 712(27)
        addi 3, 3, 1
        std 3, 712(27)
        ori 2, 2, 0
        ld 30, 16(30)
        cmpldi   30, 0
        bne      0, .LBB1_2
        b .LBB1_6
.LBB1_5:
        crmove   8, 9                   // C
.LBB1_6:                                # %cleanup
        li 3, 0                         // D
        li 4, 1                         // E
        ld 30, 320(31)                  # 8-byte Folded Reload
        ld 29, 312(31)                  # 8-byte Folded Reload
        ld 28, 304(31)                  # 8-byte Folded Reload
        ld 27, 296(31)                  # 8-byte Folded Reload
        isel 3, 4, 3, 8                 // F
        addi 1, 1, 336
        ld 0, 16(1)
        lwz 12, 8(1)
        ld 31, -8(1)
        mtocrf 32, 12
        mtlr 0
        blr


Instructions ABC use condition register to represent the result, and
instructions DEF set actual result according to the cr value. 

We can use simpler instructions. Instruction A can set reg 8 to 1, instruction
C can set reg 8 to 0, then instructions BDEF can be removed. Note that all slow
cr manipulation instructions and isel have been removed.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>