[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