Commit Graph

3299 Commits

Author SHA1 Message Date
Craig Topper 80b5f5982a [InstCombine] Support sext in foldLogicCastConstant
This adds support for sext in foldLogicCastConstant. This is a prerequisite for D36214.

Differential Revision: https://reviews.llvm.org/D36234

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309880 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-02 20:25:56 +00:00
Craig Topper dbf7ec5b15 [InstCombine] Add missing test case for (xor (sext (cmp)), -1) -> (sext (!cmp)).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309839 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-02 17:33:02 +00:00
Craig Topper fb0e1f524b [InstCombine] Add test cases for 'or' and 'xor' to match the vector 'and' of 'sext' of 'cmp' test.
When the 'and' test was originally added it was intended to make sure we didn't change it to a sext of and of cmp. But since then the test was changed to expect it to be turned into 'select cmp1, sext cmp2, 0'. Then another optimization was added to turn the select into 'sext (and cmp1, cmp2)' which is exactly the transformation that was being blocked when the test case started.

Looks like 'or' gets optimized in a similar way, but not 'xor'.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309793 91177308-0d34-0410-b5e6-96231b3b80d8
2017-08-02 06:35:15 +00:00
Sanjay Patel a1da952a23 [InstCombine] allow mask hoisting transform for vector types
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309627 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-31 21:01:53 +00:00
Sanjay Patel 9824c395ce [InstCombine] add tests for mask hoisting; NFC
The scalar transforms exist with no test coverage. The vector equivalents are missing.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309612 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-31 20:02:04 +00:00
Craig Topper 30f1058f25 [X86][InstCombine] Add some simplifications for BZHI intrinsics
This intrinsic clears the upper bits starting at a specified index. If the index is a constant we can do some simplifications.

This could be in InstSimplify, but we don't handle any target specific intrinsics there today.

Differential Revision: https://reviews.llvm.org/D36069

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309604 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-31 18:52:15 +00:00
Craig Topper db86040a35 [X86][InstCombine] Add basic simplification support for BEXTR/BEXTRI intrinsics.
This patch adds simplification support for the BEXTR/BEXTRI intrinsics to match gcc. This only supports cases that fold to 0 or can be fully constant folded. Theoretically we could support converting to AND if the shift part is unused or to only a shift if the mask doesn't modify any bits after an equivalent shl. gcc doesn't do these transformations either.

I put this in InstCombine, but it could be done in InstSimplify. It would be the first target specific intrinsic in InstSimplify.

Differential Revision: https://reviews.llvm.org/D36063

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309603 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-31 18:52:13 +00:00
Adrian Prantl 5d0334a48c Remove the obsolete offset parameter from @llvm.dbg.value
There is no situation where this rarely-used argument cannot be
substituted with a DIExpression and removing it allows us to simplify
the DWARF backend. Note that this patch does not yet remove any of
the newly dead code.

rdar://problem/33580047
Differential Revision: https://reviews.llvm.org/D35951

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309426 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-28 20:21:02 +00:00
Hiroshi Yamauchi d3335c2a9e [InstCombine] Simplify pointer difference subtractions (GEP-GEP) where GEPs have other uses and one non-constant index
Summary:
Pointer difference simplifications currently happen only if input GEPs don't have other uses or their indexes are all constants, to avoid duplicating indexing arithmetic.

This patch enables cases with exactly one non-constant index among input GEPs to happen where there is no duplicated arithmetic or code size increase even if input GEPs have other uses.

For example, this patch allows "(&A[42][i]-&A[42][0])" --> "i", which didn't happen previously, if the input GEP(s) have other uses.

Reviewers: sanjoy, bkramer

Reviewed By: sanjoy

Subscribers: mcrosier, llvm-commits

Differential Revision: https://reviews.llvm.org/D35499

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309304 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-27 18:27:11 +00:00
Daniel Neilson 6846476bcb Add element-atomic mem intrinsic canary tests for InstCombine.
Summary:
Add canary tests to verify that InstCombine currently does nothing with the element atomic memory intrinsics for memmove and memset.

Placeholder tests that will fail once element atomic @llvm.mem[move|set] instrinsics have been added to the MemIntrinsic class hierarchy. These will act as a reminder to verify that inst combine handles these intrinsics properly once they have been added to that class hierarchy.

Reviewers: reames

Reviewed By: reames

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D35502

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308247 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-18 01:06:47 +00:00
Davide Italiano eb8bc2ae4a [InstCombine] Don't violate dominance when replacing instructions.
Differential Revision:  https://reviews.llvm.org/D35376

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308144 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-16 18:56:30 +00:00
Craig Topper 1cadf61272 [InstCombine] Improve the expansion in SimplifyUsingDistributiveLaws to handle cases where one side doesn't simplify, but the other side resolves to an identity value
Summary:
If one side simplifies to the identity value for inner opcode, we can replace the value with just the operation that can't be simplified.

I've removed a couple now unneeded special cases in visitAnd and visitOr. There are probably other cases I missed.

Reviewers: spatel, majnemer, hfinkel, dberlin

Reviewed By: spatel

Subscribers: grandinj, llvm-commits, spatel

Differential Revision: https://reviews.llvm.org/D35451

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308111 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 21:49:49 +00:00
Sanjay Patel c09fbb030f [InstCombine] improve (1 << x) & 1 --> zext(x == 0) folding
1. Add a one-use check to prevent increasing instruction count.
2. Generalize the pattern matching to include vector types.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308105 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 17:26:01 +00:00
Craig Topper 59f9abe0f8 [InstCombine] Add test cases for (X & (Y | ~X)) -> (X & Y) where the not is an inverted compare. NFC
Do the same for (X | (Y & ~X)) -> (X | Y)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308104 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 17:09:23 +00:00
Craig Topper c301a9eeef [InstCombine] Move 4 test cases from a test that didn't use FileCheck and merge them into a existing test file. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308103 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 17:09:22 +00:00
Sanjay Patel 9e7e63adc7 [InstCombine] add tests for (1 << x) & 1 --> zext(x == 0) ; NFC
This fold hit the trifecta:
1. It was untested.
2. It oversteps (multiuse is not checked, so increases instruction count).
3. It is incomplete (doesn't work for vectors).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308102 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 15:55:07 +00:00
Sanjay Patel e039298b16 [InstCombine] allow (0 - x) & 1 --> x & 1 for vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308098 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 15:29:47 +00:00
Sanjay Patel 170e6bc8a4 [InstCombine] remove dead code/tests; NFCI
These patterns and tests were added to InstSimplify with:
https://reviews.llvm.org/rL303004


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308096 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-15 15:01:33 +00:00
Sanjay Patel af49601847 [InstCombine] convert bitwise (in)equality checks to logical ops (PR32401)
As discussed in:
https://bugs.llvm.org/show_bug.cgi?id=32401

we have a backend transform to undo this:
https://reviews.llvm.org/rL299542

when it's likely that the xor version leads to better codegen, but we want 
this form in IR for better analysis and simplification potential.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308031 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-14 15:09:49 +00:00
Sanjay Patel fff3d70a90 [InstCombine] add tests for PR32401; NFC
Also, add comments to a couple of tests that could be moved out of instcombine.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308029 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-14 14:43:28 +00:00
Sanjay Patel 7d5e486829 [InstCombine] auto-generate complete test checks; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308027 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-14 14:29:11 +00:00
Sanjay Patel 0dea231950 [InstCombine] put tests for commuted variants of the same fold together; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307951 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-13 20:35:45 +00:00
Sanjay Patel 4632cb1499 [InstCombine] add descriptive comments for tests; NFC
Also, remove unnecessary function attributes.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307930 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-13 17:24:57 +00:00
Mikael Holmen 3e55e45537 Add original reproducer for r307754 / PR33689
Apparently I managed to drop the test case between two revisions in
Phabricator: https://reviews.llvm.org/D35003

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307887 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-13 07:38:53 +00:00
Konstantin Zhuravlyov 8f85685860 Enhance synchscope representation
OpenCL 2.0 introduces the notion of memory scopes in atomic operations to
  global and local memory. These scopes restrict how synchronization is
  achieved, which can result in improved performance.

  This change extends existing notion of synchronization scopes in LLVM to
  support arbitrary scopes expressed as target-specific strings, in addition to
  the already defined scopes (single thread, system).

  The LLVM IR and MIR syntax for expressing synchronization scopes has changed
  to use *syncscope("<scope>")*, where <scope> can be "singlethread" (this
  replaces *singlethread* keyword), or a target-specific name. As before, if
  the scope is not specified, it defaults to CrossThread/System scope.

  Implementation details:
    - Mapping from synchronization scope name/string to synchronization scope id
      is stored in LLVM context;
    - CrossThread/System and SingleThread scopes are pre-defined to efficiently
      check for known scopes without comparing strings;
    - Synchronization scope names are stored in SYNC_SCOPE_NAMES_BLOCK in
      the bitcode.

Differential Revision: https://reviews.llvm.org/D21723



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307722 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 22:23:00 +00:00
Craig Topper 7e53087f42 [InstCombine] Add test case for PR33721.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307621 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-11 05:12:52 +00:00
Serge Guelton 65eefa7f01 Fix invalid cast in instcombine UMul/ZExt idiom
Fixes https://bugs.llvm.org/show_bug.cgi?id=25454

Do not assume IRBuilder creates Instruction where it can create Value.
Do not assume idiom operands are constant, leave generalisation ot the IRBuilder.

Differential Revision: https://reviews.llvm.org/D35114


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307554 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-10 16:51:40 +00:00
Chad Rosier 86dfeddc70 [ValueTracking] Fix the identity case (LHS => RHS) when the LHS is false.
Prior to this commit both of the added test cases were passing.  However, in the
latter case (test7) we were doing a lot more work to arrive at the same answer
(i.e., we were using isImpliedCondMatchingOperands() to determine the
implication.).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307400 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-07 13:55:55 +00:00
Chad Rosier 91054ccf0a [ValueTracking] Support icmps fed by 'and' and 'or'.
This patch adds support for handling some forms of ands and ors in
ValueTracking's isImpliedCondition API.

PR33611
https://reviews.llvm.org/D34901

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307304 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-06 20:00:25 +00:00
Craig Topper afbb3e0e90 [InstCombine] Add single use checks to SimplifyBSwap to ensure we are really saving instructions
Bswap isn't a simple operation so we need to make sure we are really removing a call to it before doing these simplifications.

For the case when both LHS and RHS are bswaps I've allowed it to be moved if either LHS or RHS has a single use since that at least allows us to move it later where it might find another bswap to combine with and it decreases the use count on the other side so maybe the other user can be optimized.

Differential Revision: https://reviews.llvm.org/D34974

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307273 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-06 16:24:21 +00:00
Craig Topper 62eb0faea5 Recommit r307064, "[InstCombine] Add test cases demonstrating creation of extra bswap instrinsic calls when when optimizing bswap and bitwise ops when the bswaps have additional uses. NFC"
The test check lines have now been fixed.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307106 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-04 20:15:24 +00:00
NAKAMURA Takumi 9e886358ff Revert r307064, "[InstCombine] Add test cases demonstrating creation of extra bswap instrinsic calls when when optimizing bswap and bitwise ops when the bswaps have additional uses. NFC"
Seems confused between %tmpN and unnamed %N to give same name.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307070 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-04 12:13:27 +00:00
Craig Topper d5180fc9b4 [InstCombine] Add test cases demonstrating creation of extra bswap instrinsic calls when when optimizing bswap and bitwise ops when the bswaps have additional uses. NFC
I assume bswap intrinsics are somewhat costly so we should be making sure we are getting rid of them not creating more.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307064 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-04 06:50:44 +00:00
Sanjay Patel 35043e01b3 [InstCombine] move and improve tests for cmp-intrinsic; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307022 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-03 14:07:40 +00:00
Craig Topper 5507b53e8d [InstCombine] Support BITWISE_OP( BSWAP(x), CONSTANT ) -> BSWAP( BITWISE_OP(x, BSWAP(CONSTANT) ) ) for splat vectors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307002 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-03 05:54:15 +00:00
Craig Topper b4277c6de7 [InstCombine] Add test cases for BITWISE_OP( BSWAP(x), CONSTANT ) -> BSWAP( BITWISE_OP(x, BSWAP(CONSTANT) ) ) with splat vectors. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307001 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-03 05:54:14 +00:00
Craig Topper e78ec11a0f [InstCombine] Support BITWISE_OP(BSWAP(A),BSWAP(B))->BSWAP(BITWISE_OP(A, B)) for vectors.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306999 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-03 05:54:13 +00:00
Craig Topper 33109d60f6 [InstCombine] Add test cases showing missed opportunity to fold BITWISE_OP(BSWAP(A),BSWAP(B))->BSWAP(BITWISE_OP(A, B)) for vectors. NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306998 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-03 05:54:12 +00:00
Sanjay Patel 8503b43b93 [InstCombine] fix crash when folding cmp+bswap vector
We assumed the constant was a scalar when creating the replacement operand.

Also, improve tests for this fold and move the tests for this fold to their own file.
I'll move the related and missing tests to this file as a follow-up.  


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306985 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-02 16:05:11 +00:00
Sanjay Patel d90638a985 [InstCombine] look through bswap/bitreverse for equality comparisons
I noticed this missed bswap optimization in the CGP memcmp() expansion, 
and then I saw that we don't have the fold in InstCombine.

Differential Revision: https://reviews.llvm.org/D34763


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306980 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-02 14:34:50 +00:00
Craig Topper d2fe411570 [InstCombine] Fold (a | b) ^ (~a | ~b) --> ~(a ^ b) and (a & b) ^ (~a & ~b) --> ~(a ^ b)
Summary:
I came across this while thinking about what would happen if one of the operands in this xor pattern was itself a inverted (A & ~B) ^ (~A & B)-> (A^B).

The patterns here assume that the (~a | ~b) will be demorganed to ~(a & b) first. Though I wonder if there's a multiple use case that would prevent the demorgan.

Reviewers: spatel

Reviewed By: spatel

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D34870

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306967 91177308-0d34-0410-b5e6-96231b3b80d8
2017-07-02 01:15:51 +00:00
Nikolai Bozhenov fd6c45d107 Revert of r306525: "Canonicalize clamp of float types to minmax"
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306815 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 10:39:09 +00:00
Hiroshi Inoue 7dab9bfe30 fix trivial typos, NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306808 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 09:11:50 +00:00
Craig Topper c9df51e6e9 [InstCombine] Add test cases to demonstrate failure to fold (a | b) ^ (~a | ~b) --> ~(a ^ b) and its commuted variants.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306801 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 07:37:42 +00:00
Craig Topper 006e1f79e6 [InstCombine] In foldXorToXor, move the commutable matcher from the LHS match to the RHS match. No meaningful change intended.
There are two conditions ORed here with similar checks and each contain two matches that must be true for the if to succeed. With the commutable match on the first half of the OR then both ifs basically have the same first part and only the second part distinguishs. With this change we move the commutable match to second half and make the first half unique.

This caused some tests to change because we now produce a commuted result, but this shouldn't matter in practice.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306800 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-30 07:37:41 +00:00
Daniel Neilson 6a7b0b9cd5 Restore original intent of memset instcombine test
Summary:
The original intent of test/Transforms/InstCombine/memset.ll was to test for lowering of llvm.memset into stores when the size of the memset is 1, 2, 4, or 8. Sometime between then and now the test has stopped testing for that, but remained passing due to testing for the absence of llvm.memset calls rather than the presence of store instructions. Right now this test ends up with an empty function body because the alloca is eliminated as safe-to-remove, which results in the llvm.memset calls's being eliminated due to their pointer args being undef; so it is not testing for conversion of llvm.memset into store instructions at all.

This change alters the test to verify that store instructions are created, and moves the target of the memset to an arg of the proc to avoid it being eliminated as unused.

Reviewers: anna, efriedma

Reviewed By: efriedma

Subscribers: efriedma, llvm-commits

Differential Revision: https://reviews.llvm.org/D34642

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306681 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-29 14:21:28 +00:00
Daniel Neilson 2e8a834380 Explicitly check for presence of correct results in instcombine memmove test
Summary:
Rather than testing for expected results, test/Transforms/InstCombine/memmove.ll is testing for the absence of calls to llvm.memmove.

In the case of test3, the test has stopped testing for materialization of loads/stores, but remained passing due to testing for the absence of llvm.memset calls rather than the presence of load/store instructions. Right now this test ends up with an empty function body because the alloca is eliminated as safe-to-remove, which results in the llvm.memmove calls being eliminated due to a pointer arg being undef; so it is not testing for conversion of llvm.memmove into load/store instructions at all.

Reviewers: eli.friedman, anna, efriedma

Reviewed By: efriedma

Subscribers: efriedma, llvm-commits

Differential Revision: https://reviews.llvm.org/D34645

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306679 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-29 14:17:50 +00:00
Keno Fischer 7caefab170 [InstCombine] Retain TBAA when narrowing memory accesses
Summary:
As discussed on the mailing list it is legal to propagate TBAA to loads/stores
from/to smaller regions of a larger load tagged with TBAA. Do so for
(load->extractvalue)=>(gep->load) and similar foldings.

Reviewed By: sanjoy
Differential Revision: https://reviews.llvm.org/D31954

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306615 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-28 23:36:40 +00:00
Sanjay Patel de55cfe393 [InstCombine] add tests for icmp with bitreversed ops; NFC
This is similar enough to bswap that we might as well handle them together in one patch.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306591 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-28 20:02:35 +00:00
Craig Topper 5f8077c634 [InstCombine] Remove 64-bit bit width restriction from m_ConstantInt(uint64_t*&)
I think we only need to make sure the value fits in 64-bits not that bit width is 64-bit.

This helps places that use this for shift amounts since the shift amount needs to be the same bitwidth as the LHS, but can't be larger than the bit width.

Differential Revision: https://reviews.llvm.org/D34737

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306577 91177308-0d34-0410-b5e6-96231b3b80d8
2017-06-28 18:07:29 +00:00