https://llvm.org/bugs/show_bug.cgi?id=25581
Bug ID: 25581 Summary: [ppc] redundant extsw and sldi instructions Product: libraries Version: trunk Hardware: PC OS: Linux Status: NEW Severity: normal Priority: P Component: Backend: PowerPC Assignee: unassignedb...@nondot.org Reporter: car...@google.com CC: llvm-bugs@lists.llvm.org Classification: Unclassified The following is a hot function from 471.omnetpp void cMessageHeap::shiftup(int from) { // restores heap structure (in a sub-heap) int i,j; cMessage *temp; i=from; while ((j=2*i) <= n) { if (j<n && (*h[j] > *h[j+1])) //direction j++; if (*h[i] > *h[j]) //is change necessary? { temp=h[j]; (h[j]=h[i])->heapindex=j; (h[i]=temp)->heapindex=i; i=j; } else break; } } When compiled with options -fno-strict-aliasing -O2 -m64 -mvsx -mcpu=power8 I got: _ZN12cMessageHeap7shiftupEi: # @_ZN12cMessageHeap7shiftupEi .Lfunc_begin14: # BB#0: # %entry lwz 7, 64(3) slwi 8, 4, 1 cmpw 8, 7 bgtlr 0 # BB#1: # %while.body.lr.ph crxor 20, 20, 20 li 5, 144 creqv 21, 21, 21 .align 4 .LBB14_2: # %while.body # =>This Inner Loop Header: Depth=1 mr 6, 4 cmpw 8, 7 bge 0, .LBB14_9 # BB#3: # %land.lhs.true # in Loop: Header=BB14_2 Depth=1 ori 4, 8, 1 // A extsw 9, 8 // B ld 7, 56(3) cror 1, 20, 20 extsw 10, 4 // C sldi 9, 9, 3 // D sldi 11, 10, 3 // E ldx 10, 7, 9 ldx 9, 7, 11 lxsdx 0, 10, 5 lxsdx 1, 9, 5 xscmpudp 1, 0, 1 blt 1, .LBB14_8 ... In the source code note that j comes from (i*2), so the lowest bit is 0, and then we have following conclusion: 1) j+1 equals to j|1, so instruction A actually computes j+1 2) extsw(j+1) equals to extsw(j) + 1 3) (j+1) << 3 equals to j<<3 + 8 So instructions ABCDE can be replaced with shorter code sequence extsw 9, 8 sldi 9, 9, 3 addi 11, 9, 8 -- You are receiving this mail because: You are on the CC list for the bug.
_______________________________________________ llvm-bugs mailing list llvm-bugs@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs