sebpop (Sebastian Pop)
User

Projects

User does not belong to any projects.

User Details

User Since
Aug 4 2014, 10:15 AM (175 w, 1 d)

Recent Activity

Wed, Dec 6

sebpop accepted D40146: [JumpThreading] Deferred preservation of DT and LVI across the pass..

The patch looks good to me.
Please address the few inline comments and commit.

Wed, Dec 6, 7:54 PM

Sep 8 2017

sebpop added a comment to D37528: [JumpThreading] Preserve DT and LVI across the pass..

@brzycki, one related thing: have you tried preserving postdominators as well? I'm not sure if that would be beneficial here, but in theory, it should be pretty simple, as you can pass exactly the same update sequences to the DominatorTree and PostDominatorTree.

I have not. I'll talk to @sebpop and see if he thinks this makes sense to include in this patch. Depending on our follow-on updates to JT we may need post dominators as well.

Even if you don't need it, it's trivial to preserve and probably worth doing.

Sep 8 2017, 6:54 AM

Jul 14 2017

sebpop updated the diff for D35430: DA: remove uses of GEP, only ask SCEV.
Jul 14 2017, 12:00 PM
sebpop created D35430: DA: remove uses of GEP, only ask SCEV.
Jul 14 2017, 11:59 AM

Apr 18 2017

sebpop accepted D32158: {GVNHoist] Mark GlobalsAA as preserved by GVNHoist..

LGTM. Thanks!

Apr 18 2017, 5:57 AM

Apr 10 2017

sebpop added a comment to D31035: [GVNHoist] Call isGuaranteedToTransferExecutionToSuccessor on each instruction.

LGTM.

Apr 10 2017, 1:06 PM

Apr 3 2017

sebpop accepted D31599: [CodeGen] Add Performance Monitor.

LGTM.

Apr 3 2017, 7:33 AM · Restricted Project
sebpop added a comment to D31599: [CodeGen] Add Performance Monitor.

Maybe we should just assert if this is not X86_64 for now?

Apr 3 2017, 7:13 AM · Restricted Project
sebpop added inline comments to D31599: [CodeGen] Add Performance Monitor.
Apr 3 2017, 6:52 AM · Restricted Project

Mar 16 2017

sebpop accepted D31035: [GVNHoist] Call isGuaranteedToTransferExecutionToSuccessor on each instruction.

LGTM.

Mar 16 2017, 11:31 AM

Mar 9 2017

sebpop added a comment to D30225: [LIR] re-enable generation of memmove with runtime checks.

Ping.

Mar 9 2017, 8:41 PM

Mar 2 2017

sebpop updated the diff for D30225: [LIR] re-enable generation of memmove with runtime checks.

Added check for HasMemmove.

Mar 2 2017, 11:39 AM
sebpop added a comment to D30225: [LIR] re-enable generation of memmove with runtime checks.

With the patch and compiling with "-mllvm -stats" the spec 2006:
Number of memcpy's formed from loop load+stores: 42

Before the patch on spec 2006:
Number of memcpy's formed from loop load+stores: 98

This looks bad.

Mar 2 2017, 8:30 AM

Mar 1 2017

sebpop added a comment to D30225: [LIR] re-enable generation of memmove with runtime checks.

With the patch and compiling with "-mllvm -stats" the spec 2006:
Number of memcpy's formed from loop load+stores: 42
Number of memset's formed from loop stores: 1398
Number of memmove's formed from loop load+stores: 129

Mar 1 2017, 8:41 AM

Feb 28 2017

sebpop updated the diff for D30225: [LIR] re-enable generation of memmove with runtime checks.

Updated patch.

Feb 28 2017, 1:48 PM
sebpop added a comment to D30225: [LIR] re-enable generation of memmove with runtime checks.

The updated patch addresses the comments from Eli and Krzysztof.

Feb 28 2017, 1:47 PM

Feb 25 2017

sebpop updated the diff for D30225: [LIR] re-enable generation of memmove with runtime checks.

Changes to address comments from Eli and Chad.

Feb 25 2017, 9:09 AM

Feb 21 2017

sebpop added a comment to D30225: [LIR] re-enable generation of memmove with runtime checks.

Why are we generating a runtime check for memmove, as opposed to memcpy?

Feb 21 2017, 5:54 PM
sebpop created D30225: [LIR] re-enable generation of memmove with runtime checks.
Feb 21 2017, 2:15 PM

Feb 16 2017

sebpop added a comment to D30035: Add const to function parameters.

Looks good to me.

Feb 16 2017, 5:57 AM

Feb 15 2017

sebpop accepted D29092: PR31729: [GVNHoist] Don't hoist unsafe scalars at -Oz.

I think Aditya has addressed the review comments from David.
David, do you see something else in the current patch that requires changes?

Feb 15 2017, 11:49 AM

Feb 6 2017

sebpop accepted D29377: [GVNHoist] Merge DebugLoc metadata on hoisted instructions.

The change looks simple enough. Please commit.

Feb 6 2017, 1:02 PM

Feb 1 2017

sebpop added a comment to D29377: [GVNHoist] Merge DebugLoc metadata on hoisted instructions.

Thanks Taewook for fixing this!
The patch looks good to me.
I cannot approve the patch, and I would like someone more knowledgeable with debug info to have a look as well.

Feb 1 2017, 6:05 AM

Jan 27 2017

sebpop accepted D29241: MachineInstr: Remove parameter from dump().

I don't mind reverting this part of the patch for now to help users of lldb.
In the long run lldb should be fixed to accept the c++ construct.

Jan 27 2017, 8:19 PM

Jan 20 2017

sebpop added a comment to D27645: debug output incorrect ["UNKNOWN"] when a MachineInstr is generated during the MachineCombiner pass and the relevant debug output is enabled.

With this change in place the a typical lldb operation fails now:

lldb > p I->dump()
error: too few arguments to function call, expected 1, have 0

I suspect this is an error in lldb. Please try with gdb to confirm.

Jan 20 2017, 5:52 PM
sebpop added inline comments to D27645: debug output incorrect ["UNKNOWN"] when a MachineInstr is generated during the MachineCombiner pass and the relevant debug output is enabled.
Jan 20 2017, 5:51 PM

Jan 12 2017

sebpop added a comment to D28380: [SelectionDAG] Handle inverted conditions when splitting into multiple branches..

The change looks good to me: I will let one of the maintainers of selectionDAG approve the patch.
Thanks for fixing this such that we can close PR31382 and commit again the gvn-hoist patch.

Jan 12 2017, 4:26 PM

Dec 30 2016

sebpop added a comment to D27068: Improve string::find.

Holy crap those improvements are impressive.

Dec 30 2016, 10:17 AM

Dec 20 2016

sebpop updated the diff for D27645: debug output incorrect ["UNKNOWN"] when a MachineInstr is generated during the MachineCombiner pass and the relevant debug output is enabled.

Fixed the problems that Gerolf has asked to be addressed, and reduced the number of changes.

Dec 20 2016, 9:59 AM
sebpop commandeered D27645: debug output incorrect ["UNKNOWN"] when a MachineInstr is generated during the MachineCombiner pass and the relevant debug output is enabled.

Taking over this patch: I will update the patch addressing all the comments from Gerolf.

Dec 20 2016, 9:56 AM

Dec 13 2016

sebpop added inline comments to D27722: [GVNHoist] Move GVNHoist to function simplification part of pipeline..
Dec 13 2016, 12:09 PM
sebpop accepted D27722: [GVNHoist] Move GVNHoist to function simplification part of pipeline..

Overall LGTM.
In the past I have seen some improvements to function inlining due to hoisting happening before inlining.
Also there may be some sinking (in cfg-simplify) happening before we have a chance to hoist expressions.
Let's commit this, and I will report if I see perf degradations, in which case we may as well run hoisting before and after inlining.

Dec 13 2016, 11:45 AM
sebpop added a comment to D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

How do you know this won't move division that used to be outside the loop (possibly multiple levels) inside the innermost loop?

Dec 13 2016, 7:27 AM

Dec 12 2016

sebpop added a reviewer for D27677: [AArch64] Guard Misaligned 128-bit store penalty by subtarget feature: evandro.
Dec 12 2016, 12:20 PM
sebpop added a comment to D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

How do you know this won't move division that used to be outside the loop (possibly multiple levels) inside the innermost loop?

Dec 12 2016, 10:58 AM
sebpop added inline comments to D27645: debug output incorrect ["UNKNOWN"] when a MachineInstr is generated during the MachineCombiner pass and the relevant debug output is enabled.
Dec 12 2016, 7:57 AM

Dec 11 2016

sebpop closed D27552: machine-instruction combiner uses too-simple algorithm to compute cost of one of the two alternatives, throws away combination results too often.
Dec 11 2016, 1:38 PM
sebpop accepted D27552: machine-instruction combiner uses too-simple algorithm to compute cost of one of the two alternatives, throws away combination results too often.

Committed as r289399.

Dec 11 2016, 1:38 PM

Dec 6 2016

sebpop accepted D27493: [GVNHoist] Invalidate MemDep when an instruction is moved..

LGTM. Thanks!

Dec 6 2016, 6:20 PM

Nov 29 2016

sebpop updated the diff for D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

Added the unittest and the change to make it pass: InsertBinop() should not hoist divisions by zero.

Nov 29 2016, 2:59 PM
sebpop planned changes to D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

Sanjoy, I think your previous patch has fixed one more place SCEVExpander::InsertBinop():
the second assert from your unittest is still failing with the current patch:

Nov 29 2016, 2:27 PM
sebpop updated the diff for D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

Updated patch with all suggestions from Sanjoy.

Nov 29 2016, 2:01 PM
sebpop added a comment to D27216: [SCEVExpand] do not hoist divisions by zero (PR30935).

I tried to address this some time back in rL286437, but that had to be reverted due to PR30976. Can you please take a look and make sure that this patch does not have the same problem?

Also, does the C++ unit test case from rL286437 also pass with this patch? If so, that would be nice to include too.

Nov 29 2016, 1:58 PM
sebpop retitled D27216: [SCEVExpand] do not hoist divisions by zero (PR30935) from to [SCEVExpand] do not hoist divisions by zero (PR30935).
Nov 29 2016, 9:44 AM

Nov 28 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

@mclow.lists could you please have a last look at this patch: the change is for a performance improvement (20% uplift on a proprietary benchmark), and all the issues mentioned in the review have been addressed.
The existing synthetic benchmark shows an overall improvement:

Nov 28 2016, 12:22 PM
sebpop added a comment to D27068: Improve string::find.

The numbers are from an x86_64-linux machine: Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
Overall the patch is a win on the synthetic benchmark.
We have also seen this in a proprietary benchmark where it accounted for about 10% speedup.

Nov 28 2016, 12:01 PM
sebpop added a comment to D27068: Improve string::find.

Definitely want to see numbers.

Nov 28 2016, 11:50 AM
sebpop added a comment to D26991: Remove unused code.

/me wonders what the perf difference when _LIBCPP_UNROLL_LOOPS is defined or not.

I think this (_LIBCPP_UNROLL_LOOPS) falls squarely into Chandler's request that we complain to him when the compiler generates sub-optimal code, instead of doing things like manually unrolling loops.

Nov 28 2016, 11:40 AM
sebpop added a comment to D27068: Improve string::find.

Please also post the performance numbers from the added benchmarks with and without the change to the lib.

Nov 28 2016, 10:13 AM
sebpop added a comment to D26991: Remove unused code.

Let's also add a testcase and show the performance improvement.

Nov 28 2016, 10:08 AM
sebpop accepted D27110: [GVNHoist] Early exit of cheap computations.

LGTM. Thanks.

Nov 28 2016, 10:07 AM
sebpop accepted D27111: Enable aggressive hoisting when optimizing for code-size..

LGTM. Thanks.

Nov 28 2016, 10:05 AM

Nov 8 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

@mclow.lists, @EricWF, ok to commit the patch?

Nov 8 2016, 6:28 AM
sebpop accepted D26391: [JumpThreading] Unfold selects that depend on the same condition.

LGTM.

Nov 8 2016, 6:25 AM

Nov 2 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..
In D24991#583877, @kubabrecka wrote:

Just a question: TSan intercepts on the dylib functions, namely __release_shared, to track the atomic accesses. Can you make sure this doesn't break? There's a few testcases for this in compiler-rt.

Nov 2 2016, 1:08 PM

Oct 31 2016

sebpop added a comment to D25624: Added 'inline' attribute to basic_string's destructor.

I'd like to understand why only the destructor?

Oct 31 2016, 1:10 PM
sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

Ping: Eric, Marshall, could you please approve or comment on this patch?
Thanks!

Oct 31 2016, 12:46 PM

Oct 28 2016

sebpop added a comment to D25624: Added 'inline' attribute to basic_string's destructor.

I don't understand:

  1. The motivation for this change
Oct 28 2016, 6:13 PM
sebpop added a comment to D25624: Added 'inline' attribute to basic_string's destructor.

Other than removing that comment the patch looks good.
Thanks!

Oct 28 2016, 8:21 AM

Oct 27 2016

sebpop added inline comments to D25624: Added 'inline' attribute to basic_string's destructor.
Oct 27 2016, 7:44 AM

Oct 26 2016

sebpop added inline comments to D24991: Inline hot functions in libcxx shared_ptr implementation..
Oct 26 2016, 9:48 AM
sebpop updated the diff for D24991: Inline hot functions in libcxx shared_ptr implementation..

The patch also implements the idea that Marshall proposed in:
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20161010/173780.html

I have an idea; it involves a macro that is sometimes "inline" and
sometimes not, and changes when you're building the library vs. when you're
just including the headers.

Oct 26 2016, 9:42 AM
sebpop commandeered D24991: Inline hot functions in libcxx shared_ptr implementation..
Oct 26 2016, 9:36 AM

Oct 24 2016

sebpop retitled D25924: [test-suite] fix telecomm-FFT for CFLAGS="-ffp-contract=on" from to [test-suite] fix telecomm-FFT for CFLAGS="-ffp-contract=on".
Oct 24 2016, 1:35 PM
sebpop retitled D25923: [test-suite] fix beamformer for CFLAGS="-ffp-contract=on" from to [test-suite] fix beamformer for CFLAGS="-ffp-contract=on".
Oct 24 2016, 1:16 PM

Oct 21 2016

sebpop accepted D25477: [JumpThreading] Unfold selects that depend on the same condition.

LGTM.

Oct 21 2016, 10:05 AM

Oct 20 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

Marshall suggests using macro as we discussed offline. For some reason the reply does not appear here: http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20161010/173780.html

Oct 20 2016, 12:24 PM

Oct 19 2016

sebpop closed D5444: Allow BB duplication threshold to be adjusted through JumpThreading's ctor.
Oct 19 2016, 9:25 AM
sebpop accepted D5444: Allow BB duplication threshold to be adjusted through JumpThreading's ctor.

This patch has been committed as https://reviews.llvm.org/rL218375

Oct 19 2016, 9:25 AM
sebpop added a comment to D22779: Clone block with icmp+branch if it likely results in further jump threading.

I like the idea that this patch is trying to address.

Oct 19 2016, 9:02 AM
sebpop abandoned D25277: [test-suite] Run FP tests twice with -ffp-contract=off/on.
Oct 19 2016, 6:48 AM
sebpop abandoned D25465: [test-suite] adding checkFP to polybench/symm .
Oct 19 2016, 6:47 AM

Oct 18 2016

sebpop added a comment to D25477: [JumpThreading] Unfold selects that depend on the same condition.

Please fix the few formating issues.
The patch looks good otherwise.

Oct 18 2016, 1:45 PM
sebpop added a comment to D24808: [AArch64] Avoid materializing 0.0 when generating FP CSEL.

Please, see https://reviews.llvm.org/D24808#554492 and let me know if you need more information.

That answers why not move into the DAGCombiner, not why not make it any constant, right?

Oct 18 2016, 12:33 PM
sebpop added a comment to D25574: Fix clang tests.

LGTM.

Oct 18 2016, 11:45 AM
sebpop added a comment to D24808: [AArch64] Avoid materializing 0.0 when generating FP CSEL.

Wouldn't this work with any constant? Should we consider it for the common DAGCombiner?

Thinking more about this suggestion, I think that this change improves code generation only if the comparison instruction has a form with an immediate operand encoding, which is very target dependent (e.g., AArch64). Otherwise, if the target has to materialize the constant for the comparison, it can be used again by the selection (e.g., x86).

Oct 18 2016, 11:36 AM

Oct 17 2016

sebpop added inline comments to D25575: test-suite: disable tests that fail when FP optimization is in effect, add support for per-ISA reference outputs.
Oct 17 2016, 3:04 PM

Oct 16 2016

sebpop added a comment to D25575: test-suite: disable tests that fail when FP optimization is in effect, add support for per-ISA reference outputs.

Hi Abe,

Doesn't D25346 deprecate this change? At least some of it?

Oct 16 2016, 8:07 AM

Oct 14 2016

sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

LGTM, thanks for fixing this properly. I leave the final approval to Renato.

Oct 14 2016, 7:40 PM
sebpop added a comment to D25624: Added 'inline' attribute to basic_string's destructor.

If I remember correctly, we pushed the fix after 3.9 was released.
Could you please explain the problem of requiring trunk LLVM to build trunk libcxx?

Oct 14 2016, 5:09 PM
sebpop updated the diff for D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

Updated patch fixes problems in adi and reg_detect.
All polybench pass with -O3 -ffp-contract=on and off on x86_64-linux.
Ok to commit?

Oct 14 2016, 5:01 PM
sebpop accepted D25624: Added 'inline' attribute to basic_string's destructor.

This got approved in the past review.
Let's commit it now that the clang bug was fixed.
Thanks Aditya for keeping track of this.

Oct 14 2016, 4:59 PM

Oct 13 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

How does this play with existing binaries? Applications that expect these functions to exist in the dylib?

This patch is majorly ABI breaking, although we could probably find a formulation that wasn't.

Oct 13 2016, 11:48 AM

Oct 12 2016

sebpop retitled D25542: GVN-hoist: avoid calling MemoryLocation::get() on a call (PR30499) from to GVN-hoist: avoid calling MemoryLocation::get() on a call (PR30499) .
Oct 12 2016, 6:43 PM

Oct 11 2016

sebpop updated the diff for D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

Complete patch implementing Proposal 2 for Polybench.

Oct 11 2016, 11:16 PM
sebpop added inline comments to D25476: GVN-hoist: fix store past load dependence analysis (PR30216, PR30499).
Oct 11 2016, 8:19 PM
sebpop added a comment to D25476: GVN-hoist: fix store past load dependence analysis (PR30216, PR30499).

The way diff and phabricator displays the MemorySSA.cpp change is strange:
all I did is move getLoadReorderability() and instructionClobbersQuery() up in the llvm namespace, all the rest remains in place.
As the amount of text remaining in place is less than what moves, diff decided to display the complement.

Oct 11 2016, 11:59 AM
sebpop updated the diff for D25476: GVN-hoist: fix store past load dependence analysis (PR30216, PR30499).

Updated to use MemorySSA.cpp:instructionClobbersQuery().
Thanks Danny for insisting on properly fixing this.

Oct 11 2016, 11:52 AM
sebpop retitled D25476: GVN-hoist: fix store past load dependence analysis (PR30216, PR30499) from to GVN-hoist: fix store past load dependence analysis (PR30216, PR30499).
Oct 11 2016, 8:30 AM
sebpop abandoned D24844: GVN-hoist: disable hoisting stores past calls (PR30499).
Oct 11 2016, 7:50 AM
sebpop retitled D25465: [test-suite] adding checkFP to polybench/symm from to [test-suite] adding checkFP to polybench/symm .
Oct 11 2016, 4:01 AM

Oct 10 2016

sebpop added a comment to D24991: Inline hot functions in libcxx shared_ptr implementation..

Please provide benchmark tests which demonstrate that these benefits are concrete and not just "potential". Moving methods out of the dylib is no easy task so I would like hard evidence that it's worth while.

Oct 10 2016, 6:46 AM

Oct 7 2016

sebpop updated subscribers of D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.
Oct 7 2016, 5:18 AM
sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

As I was mentioning, this is intended only for the Polybench, that are following a pretty regular pattern of testing loop kernels.
The patch makes 2mm run correctly for CFLAGS="", "-Ofast", and "-O3 -ffp-contract=on".
I have not looked at the other failing benchmarks to say whether this can apply to those.
I know that oggenc would be impossible to modify like this.

Right. Abe was trying to change the Make/CMake files, which could be a one-size-fits-all solution. If that works, I think we should go with that.

There are also these resource problems I was mentioning:

  • compilation time will double: e.g., Polly will optimize both kernels,
  • compute time on the device will more than double: running the kernel twice, plus an extra loop over both outputs to compare with FP_TOLERANCE.

Those two are true for all solutions we can come up with. 2mm takes 100s on ARM and 3mm takes 150s. Doubling ~50 could make it several minutes longer.

You were proposing getting something running first, then change later, but with a tolerance of 0.0001 after all aggregations, I think we could have FP=on and that tolerance in fpcmp and just run the default as a first approach, then later expand the FP=off compare.

Of course, that only works if the tolerance is low enough on all 50.

Oct 7 2016, 5:17 AM
sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

kernel() is compiled with whatever Cflags are specified by the end user of the test-suite.
The output of kernel() is matched with FP_TOLERANCE against the output of kernel_Strict_FP().
The output of kernel_Strict_FP() is hashed and compared against reference output.

Right, now I get it. So, you basically just duplicated the kernel to force FP=OFF on the second. Then you compare against the *real* timed run for FP_TOLERANCE.

Oct 7 2016, 3:32 AM
sebpop added inline comments to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.
Oct 7 2016, 2:55 AM
sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

clang-format

No. Not in the test-suite. We do not own that code, and I will not run clang-format on all the tests in the test-suite.

Not in the whole test, just in your changes. You're probably using TABS or something, and the formatting is coming wrong. Please look at the result in this page and you'll see.

Oct 7 2016, 2:46 AM
sebpop added inline comments to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.
Oct 7 2016, 2:41 AM
sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

No. Not in the test-suite. We do not own that code, and I will not run clang-format on all the tests in the test-suite.

Oct 7 2016, 2:35 AM
sebpop added a comment to D25346: [test-suite] [Polybench] run tests twice with -ffp-contract=on/off.

What I mean by bisimulation is that we would copy the kernel()
function of each polybench/test.c and name it kernelNoFP() and add
flag attributes "-fno-fast-math -ffp-contract=off" (can be split
compilation if flag attributes do not work.)
main() will call kernel() and kernelNoFP() and compare their output
with FP_TOLERANCE.
Only the execution of kernel() will be timed for benchmark performance result.
main() will only print the output from kernelNoFP() that will be
hashed and compared against the reference hash (as we currently expect
exact match of the output hash.)

So, the end result is that we'll *test* what we don't ship and we'll *benchmark* what we don't test.

Meaning we'll have green bots and fast benchmarks, but we'll have no idea if the "fast" is correct of if the correct is fast.

Oct 7 2016, 2:34 AM