[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