Commit Graph

9425 Commits

Author SHA1 Message Date
Matt Arsenault 6be67912a8 InferAddressSpaces: Support atomics
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293584 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-31 01:40:38 +00:00
Matt Arsenault de6cb7e695 InferAddressSpaces: Don't replace volatile users
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293582 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-31 01:30:16 +00:00
Matt Arsenault 264e91f294 AMDGPU: Implement hook for InferAddressSpaces
For now just port some of the existing NVPTX tests
and from an old HSAIL optimization pass which
approximately did the same thing.

Don't enable the pass yet until more testing is done.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293580 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-31 01:20:54 +00:00
Sanjay Patel 126da6d52b [InstCombine] enable (X <<nsw C1) >>s C2 --> X <<nsw (C1 - C2) for vectors with splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293570 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 23:35:52 +00:00
Sanjay Patel deb5ed0b1a [InstCombine] add vector test for (X <<nsw C1) >>s C2 --> X <<nsw (C1 - C2); NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293566 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 23:26:17 +00:00
Sanjay Patel 222619278d [InstCombine] enable more lshr(shl X, C1), C2 folds for vectors with splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293562 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 23:01:05 +00:00
Dehao Chen ff08fc9e81 Revert r292979 which causes compile time failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293557 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 22:26:05 +00:00
Sanjay Patel fdcb936596 [InstCombine] add tests for more shift-shift patterns; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293555 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 22:24:36 +00:00
Matt Arsenault fed7884d87 LSR: Don't drop address space when type doesn't match
For targets with different addressing modes in each address space,
if this is dropped querying isLegalAddressingMode later with this
will give a nonsense result, breaking the isLegalUse assertions.

This is a candidate for the 4.0 release branch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293542 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 19:50:17 +00:00
Sanjay Patel 1790b5fe1c [InstCombine] enable (X >>?exact C1) << C2 --> X >>?exact (C1-C2) for vectors with splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293524 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 18:40:23 +00:00
Sanjay Patel 913f418dfb [InstCombine] add vector splat tests for (X >>?exact C1) << C2 --> X >>?exact (C1-C2); NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293517 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 18:17:14 +00:00
Daniel Berlin 6d874b003f NewGVN: Instead of changeToUnreachable, insert an instruction SimplifyCFG will turn into unreachable when it runs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293515 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 18:12:56 +00:00
Sanjay Patel 093eb4f6ff [InstCombine] enable (X <<nsw C1) >>s C2 --> X <<nsw (C1-C2) for vectors with splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293507 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 17:19:32 +00:00
Daniel Berlin 93a40279b1 Update pr31758.ll for unreachable revert
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293502 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 17:08:06 +00:00
Daniel Berlin 77a24c81b1 Revert "NewGVN: Make unreachable blocks be marked with unreachable"
This reverts commit r293196

Besides making things look nicer, ATM, we'd like to preserve analysis
more than we'd like to destroy the CFG.  We'll probably revisit in the future

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293501 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 17:06:55 +00:00
Sanjay Patel f406e8165b [InstCombine] fixed to propagate 'exact' on lshr
The original shift is bigger, so this may qualify as 'obvious', 
but here's an attempt at an Alive-based proof:

Name: exact
Pre: (C1 u< C2)
%a = shl i8 %x, C1
%b = lshr exact i8 %a, C2 
  =>
%c = lshr exact i8 %x, C2 - C1
%b = and i8 %c, ((1 << width(C1)) - 1) u>> C2

Optimization is correct!



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293498 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 16:53:03 +00:00
Sanjay Patel c15acfb9b1 [InstCombine] add 'exact' to lshr to show that it got dropped; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293496 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 16:38:49 +00:00
Adam Nemet 8b177c8b59 [Inliner] Fold analysis remarks into missed remarks
This significantly reduces the noise level of these messages.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293492 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 16:22:45 +00:00
Sanjay Patel 00794ce70d [InstCombine] enable lshr(shl X, C1), C2 folds for vectors with splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293489 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 16:11:40 +00:00
Sanjay Patel c8ac2767b6 [InstCombine] add tests for shift-shift patterns; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293487 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-30 15:54:50 +00:00
Sanjay Patel 3a412958e7 [InstCombine] enable (X >>?,exact C1) << C2 --> X << (C2 - C1) for vectors with splats
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293435 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-29 17:11:18 +00:00
Sanjay Patel c7576ae80d [InstCombine] add tests for shl(shr X, C1), C2 transforms; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293434 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-29 16:52:59 +00:00
Mohammad Shahid 13e3a7f7a3 [SLP] Vectorize loads of consecutive memory accesses, accessed in non-consecutive (jumbled) way.
The jumbled scalar loads will be sorted while building the tree and these accesses will be marked to generate shufflevector after the vectorized load with proper mask.

Reviewers: hfinkel, mssimpso, mkuper

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

Change-Id: I9c0c8e6f91a00076a7ee1465440a3f6ae092f7ad

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293386 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-28 17:59:44 +00:00
Taewook Oh 647e08195b [InstCombine] Merge DebugLoc when speculatively hoisting store instruction
Summary: Along with https://reviews.llvm.org/D27804, debug locations need to be merged when hoisting store instructions as well. Not sure if just dropping debug locations would make more sense for this case, but as the branch instruction will have at least different discriminator with the hoisted store instruction, I think there will be no difference in practice.

Reviewers: aprantl, andreadb, danielcdh

Reviewed By: aprantl

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293372 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-28 07:05:43 +00:00
Sanjay Patel 1ca1d278d1 [InstCombine] move icmp transforms that might be recognized as min/max and inf-loop (PR31751)
This is a minimal patch to avoid the infinite loop in:
https://llvm.org/bugs/show_bug.cgi?id=31751

But the general problem is bigger: we're not canonicalizing all of the min/max forms reported
by value tracking's matchSelectPattern(), and we don't define min/max consistently. Some code
uses matchSelectPattern(), other code uses matchers like m_Umax, and others have their own
inline definitions which may be subtly different from any of the above.

The reason that the test cases in this patch need a cast op to trigger is because we don't
(yet) canonicalize all min/max forms based on matchSelectPattern() in 
canonicalizeMinMaxWithConstant(), but we do make min/max+cast transforms based on 
matchSelectPattern() in visitSelectInst().

The location of the icmp transforms that trigger the inf-loop seems arbitrary at best, so
I'm moving those behind the min/max fence in visitICmpInst() as the quick fix.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293345 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 23:26:27 +00:00
Matthew Simpson 6ea10124d1 [ARM/AArch64] Relocate and update InterleavedAccessPass tests (NFC)
The interleaved access pass is an IR-to-IR transformation that runs before code
generation. It matches interleaved memory operations to target-specific
intrinsics (that are later lowered to load and store multiple instructions on
ARM/AArch64). We place tests for similar passes (e.g., GlobalMergePass) under
test/Transforms. This patch moves the InterleavedAccessPass tests out of
test/CodeGen and into target-specific directories under
test/Transforms/InterleavedAccess.

Although the pass is an IR pass, many of the existing tests were llc tests
rather opt tests. For example, the tests would check for ldN/stN instructions
generated by llc rather than the intrinsic calls the pass actually inserts.
Thus, this patch updates all tests to be opt tests that check for the inserted
intrinsics. We already have separate CodeGen tests that ensure we lower the
interleaved access intrinsics to their corresponding ldN/stN instructions. In
addition to migrating the tests to opt, this patch also performs some minor
clean-up (to ensure consistent naming, etc.).

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293309 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 17:33:16 +00:00
Chandler Carruth cce6712519 [LICM] When we are recomputing the alias sets for a subloop, we cannot
skip sub-subloops.

The logic to skip subloops dated from when this code was shared with the
cached case. Once it was factored out to only run in the case of
recomputed subloops it became a dangerous bug. If a subsubloop contained
an interfering instruction it would be silently skipped from the alias
sets for LICM.

With the old pass manager this was extremely hard to trigger as it would
require failing to visit these subloops with the LICM pass but then
visiting the outer loop somehow. I've not yet contrived any test case
that actually manages to trigger this.

But with the new pass manager we don't do the cross-loop caching hack
that the old PM does and so we recompute alias set information from
first principles. While this seems much cleaner and simpler it exposed
this bug and would subtly miscompile code due to failing to correctly
model the aliasing constraints of deeply nested loops.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293273 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 10:27:32 +00:00
Daniel Berlin fa8de5c26f NewGVN: Add basic dead and redundant store elimination
Summary:
This adds basic dead and redundant store elimination to
NewGVN.  Unlike our current DSE, it will happily do cross-block DSE if
it meets our requirements.

We get a bunch of DSE's simple.ll cases, and some stuff it doesn't.
Unlike DSE, however, we only try to eliminate stores of the same value
to the same memory location, not just general stores to the same
memory location.

Reviewers: davide

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293258 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 02:37:11 +00:00
Xin Tong 6bc6fda8c8 Constant fold switch inst when looking for trivial conditions to unswitch on.
Summary: Constant fold switch inst when looking for trivial conditions to unswitch on.

Reviewers: sanjoy, chenli, hfinkel, efriedma

Subscribers: llvm-commits, mzolotukhin

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293250 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 01:42:20 +00:00
Chandler Carruth 90fe7e78dc [PM] Port LoopLoadElimination to the new pass manager and wire it into
the main pipeline.

This is a very straight forward port. Nothing weird or surprising.

This brings the number of missing passes from the new PM's pipeline down
to three.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293249 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 01:32:26 +00:00
Justin Lebar 3e363a8b07 [NVPTX] Upgrade NVVM intrinsics in InstCombineCalls.
Summary:
There are many NVVM intrinsics that we can't entirely get rid of, but
that nonetheless often correspond to target-generic LLVM intrinsics.

For example, if flush denormals to zero (ftz) is enabled, we can convert
@llvm.nvvm.ceil.ftz.f to @llvm.ceil.f32.  On the other hand, if ftz is
disabled, we can't do this, because @llvm.ceil.f32 will be lowered to a
non-ftz PTX instruction.  In this case, we can, however, simplify the
non-ftz nvvm ceil intrinsic, @llvm.nvvm.ceil.f, to @llvm.ceil.f32.

These transformations are particularly useful because they let us
constant fold instructions that appear in libdevice, the bitcode library
that ships with CUDA and essentially functions as its libm.

Reviewers: tra

Subscribers: hfinkel, majnemer, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293244 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-27 00:58:58 +00:00
Sanjoy Das 78fa56ce60 Revert a couple of InstCombine/Guard checkins
This change reverts:

r293061: "[InstCombine] Canonicalize guards for NOT OR condition"
r293058: "[InstCombine] Canonicalize guards for AND condition"

They miscompile cases like:

```
declare void @llvm.experimental.guard(i1, ...)

define void @test_guard_not_or(i1 %A, i1 %B) {
  %C = or i1 %A, %B
  %D = xor i1 %C, true
  call void(i1, ...) @llvm.experimental.guard(i1 %D, i32 20, i32 30)[ "deopt"() ]
  ret void
}
```

because they do transfer the `i32 20, i32 30` parameters to newly
created guard instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293227 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 23:38:11 +00:00
Daniel Berlin 8dc127c160 NewGVN: Fix bug exposed by PR31761
Summary:
This does not actually fix the testcase in PR31761 (discussion is
ongoing on the testcase), but does fix a bug it exposes, where stores
were not properly clobbering loads.

We accomplish this by unifying the memory equivalence infratructure
back into the normal congruence infrastructure, and then properly
destroying congruence classes when memory state leaders disappear.

Reviewers: davide

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293216 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 22:21:48 +00:00
Sanjay Patel 4eb218a6fd [InstCombine] fold (X >>u C) << C --> X & (-1 << C)
We already have this fold when the lshr has one use, but it doesn't need that
restriction. We may be able to remove some code from foldShiftedShift().

Also, move the similar:
(X << C) >>u C --> X & (-1 >>u C)
...directly into visitLShr to help clean up foldShiftByConstOfShiftByConst().

That whole function seems questionable since it is called by commonShiftTransforms(),
but there's really not much in common if we're checking the shift opcodes for every
fold.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293215 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 22:08:10 +00:00
Sanjay Patel 6a295f2666 [InstCombine] use m_APInt to allow (X << C) >>u C --> X & (-1 >>u C) with splat vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293208 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 20:52:27 +00:00
Sanjay Patel 76aa95eea9 [InstCombine] add tests for shift-shift folds; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293205 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 20:10:55 +00:00
Daniel Berlin b0b549acf5 NewGVN: Fix output of pr31578 testcase now that we mark unreachable blocks as unreachable
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293198 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 18:49:03 +00:00
Daniel Berlin c548ce34ef NewGVN: Make unreachable blocks be marked with unreachable
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293196 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 18:30:29 +00:00
Chandler Carruth faae5327de [LV] Fix an issue where forming LCSSA in the place that we did would
change the set of uniform instructions in the loop causing an assert
failure.

The problem is that the legalization checking also builds data
structures mapping various facts about the loop body. The immediate
cause was the set of uniform instructions. If these then change when
LCSSA is formed, the data structures would already have been built and
become stale. The included test case triggered an assert in loop
vectorize that was reduced out of the new PM's pipeline.

The solution is to form LCSSA early enough that no information is cached
across the changes made. The only really obvious position is outside of
the main logic to vectorize the loop. This also has the advantage of
removing one case where forming LCSSA could mutate the loop but we
wouldn't track that as a "Changed" state.

If it is significantly advantageous to do some legalization checking
prior to this, we can do a more careful positioning but it seemed best
to just back off to a safe position first.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293168 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 10:41:09 +00:00
Alexey Bataev 69c8d681d3 [SLP] Add one more reduction operation for extra argument test to make
it vectorizable.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293162 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 09:18:41 +00:00
Alexey Bataev add597c306 [SLP] Fixed test for extra arguments in horizontal reductions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293153 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 06:19:52 +00:00
Chandler Carruth 6d7e8f10e2 [PM] Simplify the new PM interface to the loop unroller and expose two
factory functions for the two modes the loop unroller is actually used
in in-tree: simplified full-unrolling and the entire thing including
partial unrolling.

I've also wired these up to nice names so you can express both of these
being in a pipeline easily. This is a precursor to actually enabling
these parts of the O2 pipeline.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293136 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 02:13:50 +00:00
Michael Kuperstein 3ef6c7c651 [LoopUnroll] Properly update loopinfo for runtime unrolling by 2
Even when we don't create a remainder loop (that is, when we unroll by 2), we
may duplicate nested loops into the remainder. This is complicated by the fact
the remainder may itself be either inserted into an outer loop, or at the top
level. In the latter case, we may need to create new top-level loops.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293124 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 01:04:11 +00:00
Davide Italiano f73a486408 [NewGVN] Skip uses in unreachable blocks.
Otherwise we ask for a domtree node that's not there, and we crash.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293122 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 00:42:42 +00:00
Peter Collingbourne e350b28753 LowerTypeTests: Ignore external globals with type metadata.
Thanks to Davide Italiano for finding the problem and providing a test case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293119 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 00:32:15 +00:00
Justin Lebar 34292bd5ac [ValueTracking] Implement SignBitMustBeZero correctly for sqrt.
Summary:
Previously we assumed that the result of sqrt(x) always had 0 as its
sign bit.  But sqrt(-0) == -0.

Reviewers: hfinkel, efriedma, sanjoy

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293115 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 00:10:26 +00:00
Alexey Bataev 1a40f3b238 [SLP] Extra test for functionality with extra args.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293076 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 17:24:31 +00:00
Artur Pilipenko 1dd101bfef [Guards] Introduce loop-predication pass
This patch introduces guard based loop predication optimization. The new LoopPredication pass tries to convert loop variant range checks to loop invariant by widening checks across loop iterations. For example, it will convert

  for (i = 0; i < n; i++) {
    guard(i < len);
    ...
  }

to

  for (i = 0; i < n; i++) {
    guard(n - 1 < len);
    ...
  }

After this transformation the condition of the guard is loop invariant, so loop-unswitch can later unswitch the loop by this condition which basically predicates the loop by the widened condition:

  if (n - 1 < len)
    for (i = 0; i < n; i++) {
      ...
    } 
  else
    deoptimize

This patch relies on an NFC change to make ScalarEvolution::isMonotonicPredicate public (revision 293062).

Reviewed By: sanjoy

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293064 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 16:00:44 +00:00
Artur Pilipenko c6141d3748 [InstCombine] Canonicalize guards for NOT OR condition
This is a partial fix for Bug 31520 - [guards] canonicalize guards in instcombine

Reviewed By: apilipenko

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

Patch by Maxim Kazantsev.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293061 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 14:45:12 +00:00
Simon Pilgrim a9c60bba84 [InstCombine][SSE] Add support for PACKSS/PACKUS constant folding
Differential Revision: https://reviews.llvm.org/D28949

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293060 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-25 14:37:24 +00:00