Teach 2addr pass to be do more commuting. If both uses of a two-address instruction...
authorEvan Cheng <evan.cheng@apple.com>
Sun, 25 Jan 2009 03:53:59 +0000 (03:53 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sun, 25 Jan 2009 03:53:59 +0000 (03:53 +0000)
commitd498c8f2c8eb5598bf2e0c3ab30016734e490c6b
tree33b7931d23d322b8f809c568f5600f31f6009117
parent9b9948507474acd3c5941ad7d33a37cb066803ad
Teach 2addr pass to be do more commuting. If both uses of a two-address instruction are killed, but the first operand has a use before and after the def, commute if the second operand does not suffer from the same issue.
%reg1028<def> = EXTRACT_SUBREG %reg1027<kill>, 1
%reg1029<def> = MOV8rr %reg1028
%reg1029<def> = SHR8ri %reg1029, 7, %EFLAGS<imp-def,dead>
insert => %reg1030<def> = MOV8rr %reg1028
%reg1030<def> = ADD8rr %reg1028<kill>, %reg1029<kill>, %EFLAGS<imp-def,dead>

In this case, it might not be possible to coalesce the second MOV8rr
instruction if the first one is coalesced. So it would be profitable to
commute it:
%reg1028<def> = EXTRACT_SUBREG %reg1027<kill>, 1
%reg1029<def> = MOV8rr %reg1028
%reg1029<def> = SHR8ri %reg1029, 7, %EFLAGS<imp-def,dead>
insert => %reg1030<def> = MOV8rr %reg1029
%reg1030<def> = ADD8rr %reg1029<kill>, %reg1028<kill>, %EFLAGS<imp-def,dead>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62954 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/TwoAddressInstructionPass.cpp
test/CodeGen/X86/2008-02-22-ReMatBug.ll
test/CodeGen/X86/2008-07-19-movups-spills.ll
test/CodeGen/X86/pmul.ll
test/CodeGen/X86/twoaddr-coalesce.ll [new file with mode: 0644]