[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:02:30 PDT 2017


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/
>>> builders/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-
>>> android/builds/1825
>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-
>>> android/builds/1825>
>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-
>>> android/builds/1825
>>>         <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-
>>> android/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/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
>>>         <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/swifterror.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/fp128-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/vec_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/InitializePasses.h
>>>         (original)
>>>                           +++ llvm/trunk/include/llvm/InitializePasses.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
>>>                      initializeMachineDominanceFron
>>> tierPass(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/
>>> 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
>>>         <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/f60e4afd/attachment.html>


More information about the llvm-commits mailing list