[PATCH] Passing down BinaryOperator flags to BinarySDNode + X86 optimization

Marcello Maggioni hayarms at gmail.com
Thu May 29 19:44:50 PDT 2014


Hello,

here is a proposed patch to pass down the BinaryOperator's
"NoUnsignedWrap/NoSignedWrap and IsExact" flags down to the SDNodes so that
backends can use them for additional optimizations.

The core of the patch is using the SubclassData field of SDNode for
BinarySDNodes to store the flags information.
SelectionDAGBuilder will then set the correct flag information the moment
the Binary instruction is visited during construction.

In doing this I also refactored a little bit the getNode() method accepting
two operands, extracting the main constant folding logic into a separate
static function.

The patch implementing this is the file "flag_nodes.patch" attached.

In addition I implemented an optimization where an unneeded "test
instruction" that was emitted from the X86 backend is not emitted anymore.
This optimization uses this new feature.

This optimization is contained in the "x86_opt_wrap.patch" attached.

I also added a test case that exercises the optimization in the
"factorial_test.patch"

The patch makes this snippet of code:

LBB0_1:                                 ## %while.body
                                               ## =>This Inner Loop Header:
Depth=1
         imulq   %rdi, %rax
         decq    %rdi
         testq    %rdi, %rdi
         jg      LBB0_1



become this:



LBB0_1:                                 ## %while.body
                                               ## =>This Inner Loop Header:
Depth=1
         imulq   %rdi, %rax
         decq    %rdi
         jg      LBB0_1

if the NSW flag is set on the SDNode that represents the DEC instruction
(presumably an ADD or a SUB node in this case).

If somebody could review this it would be awesome :)

Cheers,
Marcello
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/971320fa/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: factorial_test.patch
Type: text/x-patch
Size: 1802 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/971320fa/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: flag_nodes.patch
Type: text/x-patch
Size: 24119 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/971320fa/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x86_opt_wrap.patch
Type: text/x-patch
Size: 1201 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/971320fa/attachment-0002.bin>


More information about the llvm-commits mailing list