[llvm] r311038 - [MachineCopyPropagation] Extend pass to do COPY source forwarding

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 20:07:43 PDT 2017


On 311141 tests looks slow and partial_right.cc hangs in llvm-symbolizer.


On Thu, Aug 24, 2017 at 8:02 PM, Vitaly Buka <vitalybuka at google.com> wrote:

> So I see that on 311141 tests are incredibly.
> And on test partial_right.cc llvm-symbolizer hands with 100% cpu.
>
> On Thu, Aug 24, 2017 at 6:27 PM, Geoff Berry <gberry at codeaurora.org>
> wrote:
>
>> Never mind, I believe I've tracked down at least one mis-compile of
>> llvm-symbolizer using an emulator running Android w/ SDK version 24
>>
>> On 8/24/2017 12:35 PM, Geoff Berry via llvm-commits wrote:
>>
>>> I let it run all night.  Definitely hung.  I changed my cmake setting so
>>> that lit only runs one test at a time (-j1) and the first test that hangs
>>> is interception_test.cc, which is a very small test.
>>>
>>> I did have to change the Android API version from 24 to 23 in the script
>>> since I don't have a device with that version of Android installed on it
>>> handy.  Perhaps that is the cause of the hang?
>>>
>>> I'm trying to get my hands on a newer Android version device, but in the
>>> mean time would you be able to do a run at revision 311141 (which includes
>>> my original change) with -DLLVM_LIT_ARGS="-vv -j1" so we can determine
>>> exactly which lit test is hanging?
>>>
>>> On 8/23/2017 5:54 PM, Vitaly Buka wrote:
>>>
>>>> How long do you wait? it's OK if not output for a few minutes.
>>>>
>>>> On Tue, Aug 22, 2017 at 8:46 PM, Geoff Berry <gberry at codeaurora.org
>>>> <mailto:gberry at codeaurora.org>> wrote:
>>>>
>>>>     I've been trying to reproduce this failure, but I'm getting
>>>>     check-asan hangs even if I test the revision with my latest revert:
>>>>
>>>>     Is there something I need to do to the device that isn't done by
>>>>     these scripts?  Are there additional environment variables I need to
>>>>     set before running?
>>>>
>>>>     For the record I'm running:
>>>>     $ BUILDBOT_CLOBBER= BUILDBOT_REVISION=311142 ./buildbot_android.sh
>>>>
>>>>     r311142 is my latest reversion of my MachineCopyPropagation changes
>>>>     and the only changes I've made to the scripts are:
>>>>     - change the svn repo to be https:// instead of http:// to avoid
>>>> svn
>>>>     timeouts
>>>>     - add -DLLVM_LIT_ARGS="-v" to the compiler-rt cmake args so running
>>>>     check-asan will print the tests names as they run to the log file
>>>>
>>>>     It appears that the following tests are hanging:
>>>>     /data/local/tmp/Output/deep_call_stack.cc.tmp
>>>>     /data/local/tmp/Output/interception_test.cc.tmp
>>>>     /data/local/tmp/Output/quarantine_size_mb.cc.tmp
>>>>     /data/local/tmp/Output/thread_local_quarantine_size_kb.cc.tm
>>>>     <http://local_quarantine_size_kb.cc.tm>p
>>>>     /data/local/tmp/Output/coverage-module-unloaded.cc.tmp.exe
>>>>     /data/local/tmp/Output/coverage-reset.cc.tmp
>>>>     /data/local/tmp/Output/coverage.cc.tmp
>>>>     /data/local/tmp/Output/start-deactivated.cc.tmp
>>>>
>>>>
>>>>     On 8/17/2017 9:24 PM, Vitaly Buka wrote:
>>>>
>>>>         If you have android with arm 32bit, you probably can reproduce
>>>>         with running
>>>>         https://llvm.org/svn/llvm-project/zorg/trunk/zorg/buildbot/b
>>>> uilders/sanitizers/buildbot_android.sh
>>>>         <https://llvm.org/svn/llvm-project/zorg/trunk/zorg/buildbot/
>>>> builders/sanitizers/buildbot_android.sh>
>>>>         in empty directory.
>>>>
>>>>         On Thu, Aug 17, 2017 at 6:23 PM, Vitaly Buka
>>>>         <vitalybuka at google.com <mailto:vitalybuka at google.com>
>>>>         <mailto:vitalybuka at google.com <mailto:vitalybuka at google.com>>>
>>>>         wrote:
>>>>
>>>>              I just hangs on "Running the AddressSanitizer tests" for
>>>> arm
>>>>
>>>>         /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux
>>>> -android/build/compiler_rt_build_android_arm/lib/asan/tests/AsanTest:
>>>>              1 file pus
>>>>              hed. 3.7 MB/s (10602792 bytes in 2.742s)
>>>>              + echo @@@BUILD_STEP run asan lit tests
>>>>              '[arm/sailfish-userdebug/OPR1.170621.001]@@@'
>>>>              @@@BUILD_STEP run asan lit tests
>>>>              [arm/sailfish-userdebug/OPR1.170621.001]@@@
>>>>              + cd
>>>>         /var/lib/buildbot/sanitizer-buildbot6/sanitizer-x86_64-linux
>>>> -android/build/compiler_rt_build_android_arm
>>>>              + ninja check-asan
>>>>              [1/1] Running the AddressSanitizer tests
>>>>
>>>>
>>>>              But the same device passes aarch64 tests:
>>>>              [1/1] Running the AddressSanitizer tests
>>>>              -- Testing: 407 tests, 12 threads --
>>>>              Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..
>>>>              Testing Time: 87.09s
>>>>                 Expected Passes    : 202
>>>>                 Expected Failures  : 27
>>>>                 Unsupported Tests  : 178
>>>>              + echo @@@BUILD_STEP run sanitizer_common tests
>>>>              '[aarch64/sailfish-userdebug/OPR1.170621.001]@@@'
>>>>              @@@BUILD_STEP run sanitizer_common tests
>>>>              [aarch64/sailfish-userdebug/OPR1.170621.001]@@@
>>>>
>>>>
>>>>
>>>>              On Thu, Aug 17, 2017 at 5:42 PM, Geoff Berry
>>>>         <gberry at codeaurora.org <mailto:gberry at codeaurora.org>
>>>>              <mailto:gberry at codeaurora.org
>>>>         <mailto:gberry at codeaurora.org>>> wrote:
>>>>
>>>>                  It seems like this is still happening after fixing a
>>>>         couple of
>>>>                  issues with this patch.  I'll revert again shortly.
>>>>         I'm having
>>>>                  a hard time understanding what is failing from looking
>>>>         at the
>>>>                  buildbot logs though. Do you have any way of
>>>>         determining what
>>>>                  exactly is timing out?
>>>>
>>>>                  On 8/16/2017 11:13 PM, Vitaly Buka wrote:
>>>>
>>>>                      Looks like after this patch Android tests
>>>>         consistently hang
>>>>         http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-and
>>>> roid/builds/1825
>>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-an
>>>> droid/builds/1825>
>>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-an
>>>> droid/builds/1825
>>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-an
>>>> droid/builds/1825>>
>>>>
>>>>                      On Wed, Aug 16, 2017 at 1:50 PM, Geoff Berry via
>>>>                      llvm-commits <llvm-commits at lists.llvm.org
>>>>         <mailto:llvm-commits at lists.llvm.org>
>>>>                      <mailto:llvm-commits at lists.llvm.org
>>>>         <mailto:llvm-commits at lists.llvm.org>>
>>>>                      <mailto:llvm-commits at lists.llvm.org
>>>>         <mailto:llvm-commits at lists.llvm.org>
>>>>                      <mailto:llvm-commits at lists.llvm.org
>>>>         <mailto:llvm-commits at lists.llvm.org>>>> wrote:
>>>>
>>>>                           Author: gberry
>>>>                           Date: Wed Aug 16 13:50:01 2017
>>>>                           New Revision: 311038
>>>>
>>>>                           URL:
>>>>         http://llvm.org/viewvc/llvm-project?rev=311038&view=rev
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev>
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev>>
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev>
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev
>>>>         <http://llvm.org/viewvc/llvm-project?rev=311038&view=rev>>>
>>>>                           Log:
>>>>                           [MachineCopyPropagation] Extend pass to do
>>>>         COPY source
>>>>                      forwarding
>>>>
>>>>                           This change extends MachineCopyPropagation to
>>>>         do COPY
>>>>                      source forwarding.
>>>>
>>>>                           This change also extends the
>>>>         MachineCopyPropagation
>>>>                      pass to be able to
>>>>                           be run during register allocation, after
>>>> physical
>>>>                      registers have been
>>>>                           assigned, but before the virtual registers
>>>>         have been
>>>>                      re-written, which
>>>>                           allows it to remove virtual register COPY
>>>>         LiveIntervals
>>>>                      that become dead
>>>>                           through the forwarding of all of their uses.
>>>>
>>>>                           Reviewers: qcolombet, javed.absar, MatzeB,
>>>> jonpa
>>>>
>>>>                           Subscribers: jyknight, nemanjai, llvm-commits,
>>>>                      nhaehnle, mcrosier,
>>>>                           mgorny
>>>>
>>>>                           Differential Revision:
>>>>         https://reviews.llvm.org/D30751 <https://reviews.llvm.org/D307
>>>> 51>
>>>>                      <https://reviews.llvm.org/D30751
>>>>         <https://reviews.llvm.org/D30751>>
>>>>                           <https://reviews.llvm.org/D30751
>>>>         <https://reviews.llvm.org/D30751>
>>>>                      <https://reviews.llvm.org/D30751
>>>>         <https://reviews.llvm.org/D30751>>>
>>>>
>>>>                           Modified:
>>>>                                llvm/trunk/include/llvm/CodeGen/Passes.h
>>>>                                llvm/trunk/include/llvm/Initi
>>>> alizePasses.h
>>>>                                llvm/trunk/lib/CodeGen/CodeGen.cpp
>>>>           llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp
>>>>                                llvm/trunk/lib/CodeGen/Target
>>>> PassConfig.cpp
>>>>            llvm/trunk/test/CodeGen/AArch64/aarch64-fold-lslfast.ll
>>>>            llvm/trunk/test/CodeGen/AArch64/arm64-AdvSIMD-Scalar.ll
>>>>            llvm/trunk/test/CodeGen/AArch64/arm64-zero-cycle-regmov.ll
>>>>           llvm/trunk/test/CodeGen/AArch64/f16-instructions.ll
>>>>           llvm/trunk/test/CodeGen/AArch64/flags-multiuse.ll
>>>>            llvm/trunk/test/CodeGen/AArch64/merge-store-dependency.ll
>>>>                                llvm/trunk/test/CodeGen/AArch
>>>> 64/neg-imm.ll
>>>>           llvm/trunk/test/CodeGen/AMDGPU/byval-frame-setup.ll
>>>>           llvm/trunk/test/CodeGen/AMDGPU/call-argument-types.ll
>>>>            llvm/trunk/test/CodeGen/AMDGPU/call-preserved-registers.ll
>>>>            llvm/trunk/test/CodeGen/AMDGPU/callee-special-input-sgprs.ll
>>>>            llvm/trunk/test/CodeGen/AMDGPU/callee-special-input-vgprs.ll
>>>>           llvm/trunk/test/CodeGen/AMDGPU/mubuf-offset-private.ll
>>>>           llvm/trunk/test/CodeGen/AMDGPU/multilevel-break.ll
>>>>            llvm/trunk/test/CodeGen/AMDGPU/private-access-no-objects.ll
>>>>                                llvm/trunk/test/CodeGen/AMDGPU/ret.ll
>>>>                                llvm/trunk/test/CodeGen/ARM/atomic-op.ll
>>>>                                llvm/trunk/test/CodeGen/ARM/s
>>>> wifterror.ll
>>>>                                llvm/trunk/test/CodeGen/Mips/
>>>> llvm-ir/sub.ll
>>>>                                llvm/trunk/test/CodeGen/Power
>>>> PC/fma-mutate.ll
>>>>           llvm/trunk/test/CodeGen/PowerPC/inlineasm-i64-reg.ll
>>>>           llvm/trunk/test/CodeGen/PowerPC/tail-dup-layout.ll
>>>>                                llvm/trunk/test/CodeGen/SPARC/32abi.ll
>>>>                                llvm/trunk/test/CodeGen/SPARC/atomics.ll
>>>>           llvm/trunk/test/CodeGen/Thumb/thumb-shrink-wrapping.ll
>>>>            llvm/trunk/test/CodeGen/X86/2006-03-01-InstrSchedBug.ll
>>>>                                llvm/trunk/test/CodeGen/X86/a
>>>> rg-copy-elide.ll
>>>>                                llvm/trunk/test/CodeGen/X86/avg.ll
>>>>                                llvm/trunk/test/CodeGen/X86/a
>>>> vx-load-store.ll
>>>>           llvm/trunk/test/CodeGen/X86/avx512-bugfix-25270.ll
>>>>           llvm/trunk/test/CodeGen/X86/avx512-calling-conv.ll
>>>>                                llvm/trunk/test/CodeGen/X86/a
>>>> vx512-mask-op.ll
>>>>            llvm/trunk/test/CodeGen/X86/avx512bw-intrinsics-upgrade.ll
>>>>            llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-sex
>>>> t.ll
>>>>            llvm/trunk/test/CodeGen/X86/bitcast-int-to-vector-bool-zex
>>>> t.ll
>>>>           llvm/trunk/test/CodeGen/X86/buildvec-insertvec.ll
>>>>           llvm/trunk/test/CodeGen/X86/combine-fcopysign.ll
>>>>           llvm/trunk/test/CodeGen/X86/complex-fastmath.ll
>>>>           llvm/trunk/test/CodeGen/X86/divide-by-constant.ll
>>>>                                llvm/trunk/test/CodeGen/X86/fmaxnum.ll
>>>>                                llvm/trunk/test/CodeGen/X86/fminnum.ll
>>>>                                llvm/trunk/test/CodeGen/X86/f
>>>> p128-i128.ll
>>>>                                llvm/trunk/test/CodeGen/X86/haddsub-2.ll
>>>>                                llvm/trunk/test/CodeGen/X86/h
>>>> addsub-undef.ll
>>>>                                llvm/trunk/test/CodeGen/X86/half.ll
>>>>           llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll
>>>>           llvm/trunk/test/CodeGen/X86/ipra-local-linkage.ll
>>>>                                llvm/trunk/test/CodeGen/X86/l
>>>> ocalescape.ll
>>>>                                llvm/trunk/test/CodeGen/X86/mul-i1024.ll
>>>>                                llvm/trunk/test/CodeGen/X86/mul-i512.ll
>>>>                                llvm/trunk/test/CodeGen/X86/mul128.ll
>>>>                                llvm/trunk/test/CodeGen/X86/pmul.ll
>>>>                                llvm/trunk/test/CodeGen/X86/powi.ll
>>>>                                llvm/trunk/test/CodeGen/X86/pr11334.ll
>>>>                                llvm/trunk/test/CodeGen/X86/pr29112.ll
>>>>                                llvm/trunk/test/CodeGen/X86/psubus.ll
>>>>                                llvm/trunk/test/CodeGen/X86/select.ll
>>>>           llvm/trunk/test/CodeGen/X86/shrink-wrap-chkstk.ll
>>>>                                llvm/trunk/test/CodeGen/X86/s
>>>> qrt-fastmath.ll
>>>>           llvm/trunk/test/CodeGen/X86/sse-scalar-fp-arith.ll
>>>>                                llvm/trunk/test/CodeGen/X86/sse1.ll
>>>>           llvm/trunk/test/CodeGen/X86/sse3-avx-addsub-2.ll
>>>>           llvm/trunk/test/CodeGen/X86/statepoint-live-in.ll
>>>>           llvm/trunk/test/CodeGen/X86/statepoint-stack-usage.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ec_fp_to_int.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ec_int_to_fp.ll
>>>>           llvm/trunk/test/CodeGen/X86/vec_minmax_sint.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ec_shift4.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ector-blend.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-idiv-sdiv-128.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-idiv-udiv-128.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-rotate-128.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ector-sext.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-shift-ashr-128.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-shift-lshr-128.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-shift-shl-128.ll
>>>>            llvm/trunk/test/CodeGen/X86/vector-shuffle-combining.ll
>>>>           llvm/trunk/test/CodeGen/X86/vector-trunc-math.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> ector-zext.ll
>>>>                                llvm/trunk/test/CodeGen/X86/v
>>>> select-minmax.ll
>>>>                                llvm/trunk/test/CodeGen/X86/w
>>>> iden_conv-3.ll
>>>>                                llvm/trunk/test/CodeGen/X86/w
>>>> iden_conv-4.ll
>>>>           llvm/trunk/test/CodeGen/X86/x86-shrink-wrap-unwind.ll
>>>>           llvm/trunk/test/CodeGen/X86/x86-shrink-wrapping.ll
>>>>
>>>>                           Modified: llvm/trunk/include/llvm/CodeGe
>>>> n/Passes.h
>>>>                           URL:
>>>>         http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>>> CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff>>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /CodeGen/Passes.h?rev=311038&r1=311037&r2=311038&view=diff>>>
>>>>         ==============================================================================
>>>>
>>>>                           --- llvm/trunk/include/llvm/CodeGen/Passes.h
>>>>         (original)
>>>>                           +++ llvm/trunk/include/llvm/CodeGen/Passes.h
>>>>         Wed Aug 16
>>>>                      13:50:01 2017
>>>>                           @@ -278,6 +278,11 @@ namespace llvm {
>>>>                               /// MachineSinking - This pass performs
>>>>         sinking on
>>>>                      machine
>>>>                           instructions.
>>>>                               extern char &MachineSinkingID;
>>>>
>>>>                           +  /// MachineCopyPropagationPreRegRewrite -
>>>>         This pass
>>>>                      performs copy
>>>>                           propagation
>>>>                           +  /// on machine instructions after register
>>>>                      allocation but before
>>>>                           virtual
>>>>                           +  /// register re-writing..
>>>>                           +  extern char
>>>>         &MachineCopyPropagationPreRegRewriteID;
>>>>                           +
>>>>                               /// MachineCopyPropagation - This pass
>>>>         performs
>>>>                      copy propagation on
>>>>                               /// machine instructions.
>>>>                               extern char &MachineCopyPropagationID;
>>>>
>>>>                           Modified:
>>>>         llvm/trunk/include/llvm/InitializePasses.h
>>>>                           URL:
>>>>         http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/
>>>> InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff>>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm
>>>> /InitializePasses.h?rev=311038&r1=311037&r2=311038&view=diff>>>
>>>>         ==============================================================================
>>>>
>>>>                           --- llvm/trunk/include/llvm/Initia
>>>> lizePasses.h
>>>>         (original)
>>>>                           +++ llvm/trunk/include/llvm/Initia
>>>> lizePasses.h
>>>>         Wed Aug
>>>>                      16 13:50:01 2017
>>>>                           @@ -233,6 +233,7 @@ void
>>>>                      initializeMachineBranchProbabilityI
>>>>                             void initializeMachineCSEPass(PassR
>>>> egistry&);
>>>>                             void
>>>>         initializeMachineCombinerPass(PassRegistry&);
>>>>                             void
>>>>         initializeMachineCopyPropagationPass(PassRegistry&);
>>>>                           +void
>>>>         initializeMachineCopyPropagationPreRegRewritePass(PassRegist
>>>> ry&);
>>>>                             void
>>>>                      initializeMachineDominanceFro
>>>> ntierPass(PassRegistry&);
>>>>                             void
>>>>         initializeMachineDominatorTreePass(PassRegistry&);
>>>>                             void
>>>>         initializeMachineFunctionPrinterPassPass(PassRegistry&);
>>>>
>>>>                           Modified: llvm/trunk/lib/CodeGen/CodeGen.cpp
>>>>                           URL:
>>>>         http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/C
>>>> odeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff>>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> CodeGen.cpp?rev=311038&r1=311037&r2=311038&view=diff>>>
>>>>         ==============================================================================
>>>>
>>>>                           --- llvm/trunk/lib/CodeGen/CodeGen.cpp
>>>> (original)
>>>>                           +++ llvm/trunk/lib/CodeGen/CodeGen.cpp Wed
>>>> Aug 16
>>>>                      13:50:01 2017
>>>>                           @@ -54,6 +54,7 @@ void
>>>>         llvm::initializeCodeGen(PassRegistr
>>>>                               initializeMachineCSEPass(Registry);
>>>>                               initializeMachineCombinerPass(Registry);
>>>>         initializeMachineCopyPropagationPass(Registry);
>>>>                           +
>>>>         initializeMachineCopyPropagationPreRegRewritePass(Registry);
>>>>                               initializeMachineDominatorTree
>>>> Pass(Registry);
>>>>         initializeMachineFunctionPrinterPassPass(Registry);
>>>>                               initializeMachineLICMPass(Registry);
>>>>
>>>>                           Modified:
>>>>         llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp
>>>>                           URL:
>>>>         http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/M
>>>> achineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff>>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff>
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff
>>>>         <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>>>> MachineCopyPropagation.cpp?rev=311038&r1=311037&r2=311038&view=diff>>>
>>>>         ==============================================================================
>>>>
>>>>                           ---
>>>>         llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp
>>>>                      (original)
>>>>                           +++
>>>>         llvm/trunk/lib/CodeGen/MachineCopyPropagation.cpp
>>>>                      Wed Aug 16
>>>>                           13:50:01 2017
>>>>                           @@ -7,18 +7,62 @@
>>>>                             //
>>>>         //===----------------------------------------------------------------------===//
>>>>
>>>>                             //
>>>>                           -// This is an extremely simple
>>>>         MachineInstr-level copy
>>>>                      propagation
>>>>                           pass.
>>>>                           +// This is a simple MachineInstr-level copy
>>>>         forwarding
>>>>                      pass.  It
>>>>                           may be run at
>>>>                           +// two places in the codegen pipeline:
>>>>                           +//   - After register allocation but before
>>>>         virtual
>>>>                      registers have
>>>>                           been remapped
>>>>                           +//     to physical registers.
>>>>                           +//   - After physical register remapping.
>>>>                           +//
>>>>                           +// The optimizations done vary slightly
>>>> based on
>>>>                      whether virtual
>>>>                           registers are
>>>>                           +// still present.  In both cases, this pass
>>>>         forwards
>>>>                      the source of
>>>>                           COPYs to the
>>>>                           +// users of their destinations when doing so
>>>> is
>>>>                      legal.  For example:
>>>>                           +//
>>>>                           +//   %vreg1 = COPY %vreg0
>>>>                           +//   ...
>>>>                           +//   ... = OP %vreg1
>>>>                           +//
>>>>                           +// If
>>>>                           +//   - the physical register assigned to
>>>>         %vreg0 has
>>>>                      not been
>>>>                           clobbered by the
>>>>                           +//     time of the use of %vreg1
>>>>                           +//   - the register class constraints are
>>>>         satisfied
>>>>                           +//   - the COPY def is the only value that
>>>>         reaches OP
>>>>                           +// then this pass replaces the above with:
>>>>                           +//
>>>>                           +//   %vreg1 = COPY %vreg0
>>>>                           +//   ...
>>>>                           +//   ... = OP %vreg0
>>>>                           +//
>>>>                           +// and updates the relevant state required by
>>>>                      VirtRegMap (e.g.
>>>>                           LiveIntervals).
>>>>                           +// COPYs whose LiveIntervals become dead as a
>>>>         result
>>>>                      of this
>>>>                           forwarding (i.e. if
>>>>                           +// all uses of %vreg1 are changed to %vreg0)
>>>>         are removed.
>>>>                           +//
>>>>                           +// When being run with only physical
>>>>         registers, this
>>>>                      pass will also
>>>>                           remove some
>>>>                           +// redundant COPYs.  For example:
>>>>                           +//
>>>>                           +//    %R1 = COPY %R0
>>>>                           +//    ... // No clobber of %R1
>>>>                           +//    %R0 = COPY %R1 <<< Removed
>>>>                           +//
>>>>                           +// or
>>>>                           +//
>>>>                           +//    %R1 = COPY %R0
>>>>                           +//    ... // No clobber of %R0
>>>>                           +//    %R1 = COPY %R0 <<< Removed
>>>>                             //
>>>>         //===----------------------------------------------------------------------===//
>>>>
>>>>
>>>>                           +#include "LiveDebugVariables.h"
>>>>                             #include "llvm/ADT/DenseMap.h"
>>>>                             #include "llvm/ADT/SetVector.h"
>>>>                             #include "llvm/ADT/SmallVector.h"
>>>>                             #include "llvm/ADT/Statistic.h"
>>>>                           +#include "llvm/CodeGen/LiveRangeEdit.h"
>>>>                           +#include "llvm/CodeGen/LiveStackAnalysis.h"
>>>>                             #include "llvm/CodeGen/MachineFunction.h"
>>>>                             #include "llvm/CodeGen/MachineFunctionP
>>>> ass.h"
>>>>                             #include "llvm/CodeGen/MachineRegisterI
>>>> nfo.h"
>>>>                             #include "llvm/CodeGen/Passes.h"
>>>>                           +#include "llvm/CodeGen/VirtRegMap.h"
>>>>                             #include "llvm/Pass.h"
>>>>                             #include "llvm/Support/Debug.h"
>>>>                             #include "llvm/Support/raw_ostream.h"
>>>>                           @@ -30,24 +74,48 @@ using namespace llvm;
>>>>                             #define DEBUG_TYPE "machine-cp"
>>>>
>>>>                             STATISTIC(NumDeletes, "Number of dead copies
>>>>         deleted");
>>>>                           +STATISTIC(NumCopyForwards, "Number of copy
>>>> uses
>>>>                      forwarded");
>>>>
>>>>                             namespace {
>>>>                               typedef SmallVector<unsigned, 4> RegList;
>>>>                               typedef DenseMap<unsigned, RegList>
>>>> SourceMap;
>>>>                               typedef DenseMap<unsigned, MachineInstr*>
>>>>         Reg2MIMap;
>>>>
>>>>                           -  class MachineCopyPropagation : public
>>>>                      MachineFunctionPass {
>>>>                           +  class MachineCopyPropagation : public
>>>>                      MachineFunctionPass,
>>>>                           +                                 private
>>>>                      LiveRangeEdit::Delegate {
>>>>                                 const TargetRegisterInfo *TRI;
>>>>                                 const TargetInstrInfo *TII;
>>>>                           -    const MachineRegisterInfo *MRI;
>>>>                           +    MachineRegisterInfo *MRI;
>>>>                           +    MachineFunction *MF;
>>>>                           +    SlotIndexes *Indexes;
>>>>                           +    LiveIntervals *LIS;
>>>>                           +    const VirtRegMap *VRM;
>>>>                           +    // True if this pass being run before
>>>> virtual
>>>>                      registers are
>>>>                           remapped to
>>>>                           +    // physical ones.
>>>>                           +    bool PreRegRewrite;
>>>>                           +    bool NoSubRegLiveness;
>>>>                           +
>>>>                           +  protected:
>>>>                           +    MachineCopyPropagation(char &ID, bool
>>>>         PreRegRewrite)
>>>>                           +        : MachineFunctionPass(ID),
>>>>                      PreRegRewrite(PreRegRewrite) {}
>>>>
>>>>                               public:
>>>>                                 static char ID; // Pass identification,
>>>>                      replacement for typeid
>>>>                           -    MachineCopyPropagation() :
>>>>         MachineFunctionPass(ID) {
>>>>                           +    MachineCopyPropagation() :
>>>>                      MachineCopyPropagation(ID, false) {
>>>>         initializeMachineCopyPropagationPass(*PassRegistry::getPassR
>>>> egistry());
>>>>                                 }
>>>>
>>>>                                 void getAnalysisUsage(AnalysisUsage &AU)
>>>>         const
>>>>                      override {
>>>>                           +      if (PreRegRewrite) {
>>>>                           +        AU.addRequired<SlotIndexes>();
>>>>                           +        AU.addPreserved<SlotIndexes>();
>>>>                           +        AU.addRequired<LiveIntervals>();
>>>>                           +        AU.addPreserved<LiveIntervals>();
>>>>                           +        AU.addRequired<VirtRegMap>();
>>>>                           +        AU.addPreserved<VirtRegMap>();
>>>>                           +        AU.addPreserved<LiveDebugVaria
>>>> bles>();
>>>>                           +        AU.addPreserved<LiveStacks>();
>>>>                           +      }
>>>>                                   AU.setPreservesCFG();
>>>>                                   MachineFunctionPass::getAnalys
>>>> isUsage(AU);
>>>>                                 }
>>>>                           @@ -55,6 +123,10 @@ namespace {
>>>>                                 bool
>>>>         runOnMachineFunction(MachineFunction &MF)
>>>>                      override;
>>>>
>>>>                                 MachineFunctionProperties
>>>>         getRequiredProperties()
>>>>                      const override {
>>>>                           +      if (PreRegRewrite)
>>>>                           +        return MachineFunctionProperties()
>>>>                           +           .set(MachineFunctionPropertie
>>>> s::Property::NoPHIs)
>>>>                           +           .set(MachineFunctionPropertie
>>>> s::Property::TracksLiveness);
>>>>                                   return MachineFunctionProperties().se
>>>> t(
>>>>         MachineFunctionProperties::Property::NoVRegs);
>>>>                                 }
>>>>                           @@ -64,6 +136,28 @@ namespace {
>>>>                                 void ReadRegister(unsigned Reg);
>>>>                                 void
>>>>         CopyPropagateBlock(MachineBasicBlock &MBB);
>>>>                                 bool eraseIfRedundant(MachineInstr
>>>> &Copy,
>>>>                      unsigned Src,
>>>>                           unsigned Def);
>>>>                           +    unsigned getPhysReg(unsigned Reg,
>>>>         unsigned SubReg);
>>>>                           +    unsigned getPhysReg(const MachineOperand
>>>>         &Opnd) {
>>>>                           +      return getPhysReg(Opnd.getReg(),
>>>>         Opnd.getSubReg());
>>>>                           +    }
>>>>                           +    unsigned getFullPhysReg(const
>>>>         MachineOperand &Opnd) {
>>>>                           +      return getPhysReg(Opnd.getReg(), 0);
>>>>                           +    }
>>>>                           +    void forwardUses(MachineInstr &MI);
>>>>                           +    bool isForwardableRegClassCopy(const
>>>>         MachineInstr
>>>>                      &Copy,
>>>>                           +                                   const
>>>>         MachineInstr
>>>>                      &UseI);
>>>>                           +    std::tuple<unsigned, unsigned, bool>
>>>>                           +    checkUseSubReg(const MachineOperand
>>>>         &CopySrc, const
>>>>                           MachineOperand &MOUse);
>>>>                           +    bool hasImplicitOverlap(const
>>>>         MachineInstr &MI, const
>>>>                           MachineOperand &Use);
>>>>                           +    void narrowRegClass(const MachineInstr
>>>>         &MI, const
>>>>                           MachineOperand &MOUse,
>>>>                           +                        unsigned NewUseReg,
>>>>         unsigned
>>>>                      NewUseSubReg);
>>>>                           +    void updateForwardedCopyLiveInterva
>>>> l(const
>>>>                      MachineInstr &Copy,
>>>>                           +
>>>>  const
>>>>                      MachineInstr &UseMI,
>>>>                           +
>>>>  unsigned
>>>>                      OrigUseReg,
>>>>                           +
>>>>  unsigned
>>>>                      NewUseReg,
>>>>                           +
>>>>  unsigned
>>>>                      NewUseSubReg);
>>>>                           +    /// LiveRangeEdit callback for
>>>>         eliminateDeadDefs().
>>>>                           +    void
>>>>         LRE_WillEraseInstruction(MachineInstr *MI)
>>>>                      override;
>>>>
>>>>                                 /// Candidates for deletion.
>>>>                                 SmallSetVector<MachineInstr*, 8>
>>>>         MaybeDeadCopies;
>>>>                           @@ -75,6 +169,15 @@ namespace {
>>>>                                 SourceMap SrcMap;
>>>>                                 bool Changed;
>>>>                               };
>>>>                           +
>>>>                           +  class MachineCopyPropagationPreRegRewrite
>>>> :
>>>>         public
>>>>                           MachineCopyPropagation {
>>>>                           +  public:
>>>>                           +    static char ID; // Pass identification,
>>>>                      replacement for typeid
>>>>                           +    MachineCopyPropagationPreRegRewrite()
>>>>                           +        : MachineCopyPropagation(ID, true) {
>>>>                           +           initializeMachineCopyPropagat
>>>> ionPreRegRewritePass(*PassRegistry::getPassRegistry());
>>>>                           +    }
>>>>                           +  };
>>>>                             }
>>>>                             char MachineCopyPropagation::ID = 0;
>>>>                             char &llvm::MachineCopyPropagationID =
>>>>                      MachineCopyPropagation::ID;
>>>>                           @@ -82,6 +185,29 @@ char
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170824/64af6fdc/attachment-0001.html>


More information about the llvm-commits mailing list