[PATCH] Reassociate in favor of grouping previously paired operands
Xuetian Weng
xweng at google.com
Mon Jun 8 16:04:00 PDT 2015
Hi dberlin, meheff, majnemer, jingyue,
This patch enhances Reassociate to group operands that are paired
previously. With this patch, Reassociate can expose in general more
opportunities for later redundancy elimination. For example,
foo(a + c);
foo(a + (b + c));
Previously,
t1 = a + c;
foo(t);
t2 = b + c;
t3 = a + t2;
foo(t3); // using 5 instructions
With this patch, since a, c are paired together in t1, later instruction
will try to pair a, c together so it can be optimized to
t1 = a + c;
foo(t1);
t2 = t1 + b;
foo(t2); // using 4 instructions
We implement this idea leveraging a data structure called
LastOperandPairsMap that stores the most recently paired operands. It is
indexed by a Value and its corresponding Opcode in this pair.
For example, LastOperandPairsMap[x][op] = <y, I> means there is an instruction I
in form of (op x, y) or or (op y, x) in the current block.
Each time when function ReassocaiteExpression sorts the operands of an
expression, it searches the map for any pair of leaves that have been
reassociated recently, and moves such pair (if any) to the end of the
operand list so that they are guaranteed to be grouped together by function
RewriteExprTree later.
Note that this optimization overlaps quite a bit with NaryReassociate.
However, since NaryReassociate requires ScalarEvolution and is a
iterative algorithm, NaryReassociate is much more expensive than the
algorithm introduced in this patch and thus cannot be run as pervasively
as Reassociate. This optimization allows Reassociate to cheaply handle
many cases NaryReassociate is designed for.
http://reviews.llvm.org/D10327
Files:
lib/Transforms/Scalar/Reassociate.cpp
test/Transforms/Reassociate/pair.ll
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10327.27345.patch
Type: text/x-patch
Size: 11818 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150608/1efef359/attachment.bin>
More information about the llvm-commits
mailing list