Commit graph

582613 commits

Author SHA1 Message Date
Renato Golin
8b66d829fb
[Docs] Update coding standard for TD files (#200848)
This PR proposes an update to the coding standards document to make
explicit that we do not want unnecessary formatting changes to TD files.

This is in response to this merged PR (#199346), which lead to this RFC
(https://discourse.llvm.org/t/80-column-limit-for-td-files/90950/).

---------

Co-authored-by: Vlad Serebrennikov <serebrennikov.vladislav@gmail.com>
2026-06-01 21:35:58 +01:00
Alex Langford
385ba8821c
[lldb] Fix TestBranchIslands.py for arm64e (#200498)
Need to pass CFLAGS to clang when building the asm files, otherwise the
triple isn't used and they're automatically compiled for the host
platform.
2026-06-01 13:27:28 -07:00
Andy Kaylor
3e45dea1ec
[CIR] Spill and reload values across deferred cleanup scopes (#200904)
The `valuesToReload` handling in our `RunCleanupScope::forceCleanup()`
function was not taking into account cleanup scopes for deferred
conditional cleanups that get created when we call
`forceDeactivation()`. This was leading to a CIR verification error in
cases where a deferred cleanup was used in an expression that returns a
value.

This change adds code to spill values ahead of the `forceDeactivation()`
call when we see that there are cleanups on the deferred stack.

Assisted-by: Cursor / claude-opus-4.7
2026-06-01 13:17:21 -07:00
Alex Duran
43ce763ada
[OFFLOAD][L0][NFC] Rename AsyncQueueTy struct to L0QueueTy (#200921)
L0QueueTy is more descriptive after the changes in #200650.

Also renamed the header name and one internal field to be more
descriptive.
2026-06-01 20:16:47 +00:00
Alex Duran
a4f3a0153b
[OFFLOAD][L0][NFC] Remove Device TLS table (#200923)
After #200650 the Device TLS table is not used anymore so it can be
removed.
2026-06-01 22:13:03 +02:00
Amir Ayupov
a330c89d7d
[BOLT] Add perf2bolt pre-aggregated profile output
Add a pre-aggregated profile output format (`--profile-format=preagg`)
so perf.data can be pre-parsed/aggregated and used as input with -pa.

Supports branch (T traces) and basic samples (S records).

Currently only covers main binary, can be extended to cover multi-DSO.

Test Plan: Updated perf_test.test, added perf_brstack.test

Reviewers:
yota9, ayermolo, yozhu, maksfb, yavtuk, paschalis-mpeis, rafaelauler

Reviewed By: paschalis-mpeis

Pull Request: https://github.com/llvm/llvm-project/pull/199465
2026-06-01 13:10:22 -07:00
Florian Hahn
f323e93d46
[VPlan] Propagate print flags for VPInstructionWithType. (#200838)
Update VPInstructionWithType::print to include printing flags.
2026-06-01 20:03:32 +00:00
Krzysztof Drewniak
5fa177b90c
[mlir][ROCDL][AMDGPU] Add result arguments to buffer atomics (#198596)
Buffer atomic operations were failing LLVM validation because they
weren't declared as having a result (the old value). This commit updates
those operations to fix the error. (Note: if you don't need the result,
you just don't use it, and the compiler backend emits an atomic that
doesn't return the old value.)
2026-06-01 13:02:47 -07:00
Alex Langford
7a9fdaa0b1
[lldb] Skip minidump case in TestDynamicValue.py for arm64e (#200047)
The minidump format does not currently have a way to distinguish arm64e
from arm64.
2026-06-01 20:01:29 +00:00
Arthur Eubanks
27d344d36e
[gn build] Port 7964b66b (#200914) 2026-06-01 12:42:34 -07:00
Sergei Druzhkov
659c3fbd73
[lldb-dap] Mark source deemphasize if path doesn't exist (#194702)
LLDB-DAP has a problem with sanitizers in GCC. When we stop in
sanitizer's code, lldb-dap sends stack frames with path (sanitizer's
build dir path) that doesn't exist on machine. It leads to problems in
VS Code UI (see issue below).

Fixes #184789
2026-06-01 22:36:09 +03:00
Simon Pilgrim
4aa9a9f6f6
[X86] lowerShuffleAsBitMask - use getConstVector to create bitmask (#200889)
Avoids wasteful SDValue creation if the shuffle matching fails, handles
any i64 legalisation, avoid issues with later folds not recognising fp
'allones' masks and makes it easier to add UNDEF element handling in the
future.
2026-06-01 19:35:27 +00:00
Delaram Talaashrafi
eae4d72971
[openacc] Attach Parallelism Levels to Auto Loops (#200884)
Auto loops are analyzed by the compiler in later compilation stages to
determine whether they can be parallelized. These loops may carry
parallelism levels (this does not guarantee that they are parallelizable, 
compiler should still analyze them). However, if the loop is parallelized, 
the parallelism levels specified in the source should be respected. This 
change attaches the parallelism level to auto loops, which enables their 
propagation through next compilation steps.
2026-06-01 15:27:14 -04:00
Alex Duran
8c30cb246c
[OFFLOAD][L0] Add support for dynamic l0 fallbacks (#200517)
The PR adds support to define fallbacks for DLWRAP routines that are not
found when loading the library.
It implements a fallback for
zeCommandListAppendLaunchKernelWithArguments introduced in #194333 which
might not be available in older drivers.
2026-06-01 21:24:54 +02:00
Jared Hoberock
4b3249a79b
[MLIR][GPU] Support synchronous gpu.alloc and gpu.dealloc in gpu-to-llvm (#191661)
The gpu-to-llvm conversion patterns for gpu.alloc and gpu.dealloc
previously required async tokens for non-host shared operations. This
prevented lowering synchronous device memory allocation and deallocation
to runtime calls.

Changes:
- gpu.alloc: drop the isAsyncWithOneDependency guard for non-shared
allocs. Cap the number of async dependencies at one to preserve the
prior single-dependency invariant. Cast the runtime-returned pointer to
the memref's address space when they differ, so the descriptor's pointer
slots type-check for memref<..., N>.
- gpu.dealloc: drop the async requirement entirely. Use a null stream
when no async dependencies are present. Use eraseOp instead of replaceOp
for sync deallocs (which have no results). Cap the number of async
dependencies at one.
- Add a unit test for the synchronous alloc/dealloc lowering and a test
that more than one async dependency leaves the op unconverted.
- Update lower-launch-func-bare-ptr.mlir, which previously asserted
gpu.alloc survived the conversion (because the pattern bailed for sync
non-shared allocs); it now asserts the full lowering through
mgpuMemAlloc + addrspacecast.

Assisted-by: Claude
2026-06-01 21:23:44 +02:00
Arthur Eubanks
4c64e23f91
[gn build] Port commits (#200910)
3d24f9acc9
7963f459e2
7a435caaf3
866945c202
a0ac752134
2026-06-01 12:17:36 -07:00
Endre Fülöp
c5eafbcc29
[analyzer] Normalize sub-array indices in RegionStore initializer res… (#200044)
…olution

After #198346, alpha.unix.cstring.UninitializedRead reports a false
positive when a pointer into a fully-initialized const multidimensional
array is advanced past an inner dimension boundary and used as a source
argument to memcpy. The root cause is in
`convertOffsetsFromSvalToUnsigneds` in RegionStore, which returned
UndefinedVal for any element index exceeding its sub-array extent,
conflating pointer arithmetic legality with memory initializedness.

This patch separates the two concerns. The RegionStore now normalizes
indices that overflow an inner dimension by carrying into the outer
dimension via divmod, the same way `arr[0][5]` in `int arr[4][3]`
denotes the same memory as `arr[1][2]`. UndefinedVal is returned only
when the computed flat offset exceeds the total array allocation.
Whether cross-subobject pointer arithmetic constitutes undefined
behavior per C/C++ standards is a separate concern for individual
checkers to diagnose. No existing checker flags sub-array boundary
crossing as UB, verified both before and after #198346.

Fixes #199271
2026-06-01 21:12:56 +02:00
Endre Fülöp
ae464f6295
[clang-tidy] Fix cert-err33-c inheriting CheckedReturnTypes from bugp… (#200169)
…rone-unused-return-value

The cert-err33-c alias did not override CheckedReturnTypes, causing it
to inherit the default from bugprone-unused-return-value. This made it
flag any function returning std::error_code, std::expected, etc. That is
outside the scope of CERT ERR33-C (a fixed list of C standard library
functions).
Set CheckedReturnTypes to empty so the alias only checks its intended
function list.

---------

Co-authored-by: EugeneZelenko <eugene.zelenko@gmail.com>
2026-06-01 21:12:02 +02:00
lntue
4a00d0099b
[libc][ci] Use lld for linking in precommit CIs. (#200897) 2026-06-01 15:11:17 -04:00
Ege Beysel
948b2b594a
[mlir][Linalg] Enable lowering/decomposing scalable pack ops (#200216)
Enables lowering/decomposing `linalg.pack` ops with dynamic inner tiles
to a sequence of `tensor.pad` -> `tensor.expand_shape` ->
`linalg.transpose` ops.

---------

Signed-off-by: Ege Beysel <beyselege@gmail.com>
2026-06-01 21:08:41 +02:00
Alex Duran
4ae3323996
[OFFLOAD][L0] Refactor AsyncQueues (#200650)
This PR introduces a major refactor on how L0 queues are used in the
plugin as the current design is too tied to OpenMP behavior. There are
two major changes:

* We no longer have a per-thread queue cache as this resulted in a
single logical queue backed up by multiple L0 queues. We now have a per
device cache which should have a similar level of reuse performance.
* The AsyncQueueTy type has been largely extended to hide the logic of
the different queues types (which are now subclasses of AsyncQueueTy).
This has greatly simplified the L0Device implementation.

As part of this refactor a number of other changes happened:

* Copy command lists were removed in favor of the
ZE_COMMAND_QUEUE_FLAG_COPY_OFFLOAD_HINT driver hint.
* Support for inorder queues was added (can be selected using
LIBOMPTARGET_LEVEL_ZERO_COMMAND_MODE=inorder).
* Sync queues now use inorder queues.
* Queue operations conditionally only use events when necessary (OMPT,
profiling or queue logic).
* MemFill now support asynchronous operations

There are a few more things that still need to be adjusted and cleanup
but as this PR is already big enough as it is, I'll prepare a follow-up
to fix them.
2026-06-01 20:58:03 +02:00
Ilia Kuklin
910b4af811
Revert "[llvm-objcopy] Strip header from DXContainer's ILDB part during --dump-section" (#200867)
Reverts llvm/llvm-project#198578
Failed build: https://lab.llvm.org/buildbot/#/builders/190/builds/43332
2026-06-01 23:51:21 +05:00
Simon Pilgrim
0b411ba0a2
[X86] lowerShuffleAsBitBlend - use getConstVector to create selection mask (#200877)
Avoids wasteful SDValue creation if the shuffle matching fails, handles
any i64 legalisation and makes it easier to add UNDEF element handling
in the future.
2026-06-01 18:50:11 +00:00
Wael Yehia
9433fd7666
[AIX] Set the ifunc constructor's priority to 100, to run before any user code (#200893)
Co-authored-by: Wael Yehia <wyehia@ca.ibm.com>
2026-06-01 14:45:34 -04:00
Andy Kaylor
0d98eb6e87
[CIR] Fix ordering of lifetime-extended cleanups (#200874)
We had a bug that was causing any lifetime-extended cleanups that
occurred within a full-expression cleanup scope to be emitted
prematurely when the expression also required deferred conditional
cleanups. This was, in some cases, causing a dangling reference to
temporaries that had already been destructed. Luckily, it was also
causing us to not emit a return at the end of the function in one case,
leading the verifier to draw attention to this problem.

This change introduces new functions in RunCleanupsScope to allow
"ordinary" EH stack cleanups to be force-emitted separately from
lifetime-extended cleanups. Classic codegen doesn't need this capability
because it handles deferred conditional cleanups very differently than
CIR due to its flat/branching approach.

The testing for this fix did uncover a significant issue wherein CIR is
calling destructors in the wrong order even after the fix in this PR.
However, that's a pre-existing issue that will require changes beyond
the scope of this fix, so I'll handle it in a follow-up.

Assisted-by: Cursor / claude-opus-4.7
2026-06-01 11:39:23 -07:00
lijinpei-amd
dc448dad35
[VectorCombine] Don't fold non-idempotent shuffle reductions when shuffle duplicates element (#200778)
This is a small correctness fix for foldShuffleChainsToReduce. For odd /
non-power-of-2 vector sizes the parity-mask scheme duplicates a lane,
which is only sound when the reduction op is idempotent. For
non-idempotent ops (e.g. add, xor) the duplicated lane changes the
result, so I track a HasLaneDuplication flag and bail out of the fold in
that case. Tests cover non-foldable add/xor and a still-foldable
idempotent smax.
2026-06-01 18:39:06 +00:00
Florian Hahn
80875b8a63
[LV] Add users to header phis in tests (NFC). (#200890)
Make sure the header phis in various tests are actually used, to make
them more robust w.r.t. to future simplification changes. Those dead
phis would be cleaned up before LV in the regular pipeline.
2026-06-01 18:35:41 +00:00
Nikita Popov
209d77c43a
[IR] Reorder checks in isInterposable() (NFC) (#200862)
The isDSOLocal() check is a lot cheaper than getSemanticInterposition(),
so perform it first.
2026-06-01 20:35:21 +02:00
Zorojuro
0f1f234990
[libc][math] Adding constexpr to tests for Double-type math functions (#200681)
Similar to 
```CPP
  constexpr uint64_t X_COUNT = 123;
  constexpr uint64_t X_START = FPBits(0.25).uintval();
  constexpr uint64_t X_STOP = FPBits(4.0).uintval();
  constexpr uint64_t X_STEP = (X_STOP - X_START) / X_COUNT;

  constexpr uint64_t Y_COUNT = 137;
  constexpr uint64_t Y_START = FPBits(0.25).uintval();
  constexpr uint64_t Y_STOP = FPBits(4.0).uintval();
  constexpr uint64_t Y_STEP = (Y_STOP - Y_START) / Y_COUNT;
  ```
  in [atan2_test.cpp](https://github.com/llvm/llvm-project/blob/main/libc/test/src/math/atan2_test.cpp)
  This PR tends to add constexpr to all double function tests-only
  
  Additonally, replacing 
  ``` CPP
  LIBC_NAMESPACE::fputil::FPBits<double>(x).uintval();
   ```
to 
```CPP
FPBits(x).uintval();
```
  Assisted using Copilot.
2026-06-01 14:30:20 -04:00
Justin Lebar
e5851a8f30
[NVPTX] Fix fptosi/fptoui to i1. (#200718)
The langref says:

> The 'fptosi' instruction converts its floating-point operand into the
> nearest (rounding towards zero) signed integer value. If the value
> cannot fit in ty2, the result is a poison value.

Previously `fptosi to i1` and `fptoui to i1` were lowered as `x == 0.0`,
which is clearly incorrect.

Because the conversion truncates toward zero, the only results that are
not poison are:

 - 0 and -1 for the signed case, and
 - 0 and 1 for the unsigned case.

So the i1 result is fully determined by a single fp compare:

 - `fptosi x to i1`  ==  `x <= -1.0`
 - `fptoui x to i1`  ==  `x >= 1.0`

with any value being acceptable for the poison (out-of-range) inputs.
2026-06-01 18:28:39 +00:00
Harlen Batagelo
09bf7ef7d7
[Testing] Allow custom markers in llvm::Annotations (#195570)
The current annotation markers can conflict with several language
constructs. Notably, `[[ ]]` and `^` collide with C++ attributes (e.g.,
`[[nodiscard]]`), the C++26 reflection operator (`^^int`), and
Objective-C blocks (`void (^foo)(void)`). Similarly, `$` can conflict
with identifiers that also use `$` with `-fdollars-in-identifiers`, as
well as with C++26 code that uses `$` as raw-string delimiters or as a
preprocessing token
([P2558R2](https://www.open-std.org/JTC1/SC22/WG21/docs/papers/2023/p2558r2.html)).

Because the markers are currently hardcoded in `llvm::Annotations`,
existing workarounds have to rely on digraphs or macro substitution via
implicit `#define`s. These approaches reduce readability and make tests
cumbersome to write. This PR alleviates these issues by adding support
for custom markers. It adds an overloaded `Annotations` constructor that
accepts a new `Annotations::Markers` struct. For example, to use `~` for
point, `@` for name, and `{{`/`}}` for range:

```cpp
Annotations Example(R"cpp(
  @name(payload){{[[nodiscard]] int foo(int x);}}~
)cpp", {"~", "@", "{{", "}}"});
```

Alternatively, we can use setters to customize the markers individually:
```cpp
Annotations Example(R"cpp(
  @name(payload){{[[nodiscard]] int foo(int x);}}~
)cpp", Annotations::Markers().setPoint("~")
                             .setName("@@")
                             .setRangeBegin("{{")
                             .setRangeEnd("}}"));
```

Using longer markers:
```cpp
Annotations Example(R"cpp(
  $$name(payload)[[[[[nodiscard]] int foo(int x);]]]^^
)cpp", {"^^", "$$", "[[[", "]]]"});
```

Using multi-byte characters:
```cpp
Annotations Example(R"cpp(
  🏷️name(payload)👉[[nodiscard]] int foo(int x);👈🎯
)cpp", {"🎯", "🏷️", "👉", "👈"});
```

The existing single-argument constructor delegates to the new overload,
preserving backward compatibility.

PS: The original code has a FIXME comment mentioning alternative
approaches, such as escaping and changing the default syntax. While
valid, escaping would increase visual noise, and changing the default
syntax would break existing tests. The approach proposed here provides
the flexibility to choose a syntax that is clean for a specific context
and is backward compatible. See https://reviews.llvm.org/D59814 for
earlier discussion about these alternative design choices.
2026-06-01 21:26:41 +03:00
Krzysztof Parzyszek
8bae84de90
[flang][OpenMP] Simplify checks for type-parameter inquiry (#198217)
Remove the no longer needed IsDataRefTypeParamInquiry.
2026-06-01 13:23:40 -05:00
Lily Gorsheneva
b8db0a46a0
Make tests added in rd5a24ef work in read-only source filesystems. (#200883) 2026-06-01 18:17:09 +00:00
Madhur Amilkanthwar
56ccbc2531
Revert "[LoopUnroll] Support parallel reductions for minmax (#182473)" (#200892)
This reverts commit 1e79ea1f5b.
2026-06-01 23:41:03 +05:30
Arseniy Obolenskiy
2a2e45257b
[AMDGPU] Use fpext to widen sub DWORD FP printf args (#200870)
Widening half/bfloat printf varargs via bitcast+sext corrupted the FP
bit pattern for negative values

Extend by value-preserving fpext to float instead
2026-06-01 20:02:39 +02:00
Arseniy Obolenskiy
52ff7167af
[AMDGPU] Use S_MOV_B64_IMM_PSEUDO when moving 64-bit VGPR const to SGPR (#200576)
S_MOV_B64 only encodes a 32-bit literal, so rematerializing a non-inline
64-bit immediate through it silently dropped the high 32 bits
2026-06-01 20:02:31 +02:00
Aayush Shrivastava
203c0668d4
[clang] Fix assertion crash in alloc_size structural equivalence check (#199407) (#199980)
Fixes #199407

Remove ParamIdx from the `USE_DEFAULT_EQUALITY` default-comparison path
and add an explicit `equalAttrArgs<ParamIdx>` specialization that safely
handles invalid (unset) values.
2026-06-01 19:57:37 +02:00
Sergei Barannikov
6277fbf3f1
[Support] Remove unused argument of DataExtractor constructor (NFC) (#197121)
`AddressSize` parameter is not used by `DataExtractor` and will be
removed in the future. See #190519 for more context.
2026-06-01 20:47:47 +03:00
Florian Hahn
294b72f48f
[VPlan] Assert operand correctness at construction. (NFC) (#200686)
Update VPWidenPHIRecipe, VPBlendRecipe and VPReductionRecipe to assert
type correctness at construction.

PR: https://github.com/llvm/llvm-project/pull/200686
2026-06-01 17:40:15 +00:00
NeKon69
d101018996
[LifetimeSafety] Store cleanup expressions for temporaries (#200568)
Now in `CFGFullExprCleanup` we also store a cleanup expressions to be
able to get an accurate location where destruction happened.

This helps user understand lifetime semantics of objects better.

Closes #195503
2026-06-01 19:39:40 +02:00
Aayush Shrivastava
cd6891edcf
[libc][math] Add missing math.yaml entries for acospif and atan2f16 (#199442)
Fixes #199266

This PR adds missing `math.yaml` entries for `acospif` and `atan2f16`.
2026-06-01 13:39:09 -04:00
Madhur Amilkanthwar
1e79ea1f5b
[LoopUnroll] Support parallel reductions for minmax (#182473)
This patch
* Supports parallel reductions for min/max operations in LoopUnroller.
* Adds relevant test (including intrinsics).
* Renames flag -unroll-add-parallel-reduction to
-unroll-parallel-reduction.
* Relaxes check in IVDescriptors.cpp (`getMinMaxRecurrence`) to handle
out-of-loop uses.

Planning to take support for vector types in the next patch.
2026-06-01 17:37:24 +00:00
Hristo Hristov
4044ea38d4
[libc++] Applied [[nodiscard]] to optional::iterator (#198489)
Towards #172124
2026-06-01 20:28:45 +03:00
Leandro Lupori
754d3d0d96
Reland "[flang][OpenMP] Fix lowering of LINEAR iteration variables (#188851)" (#194623)
Linear iteration variables were being treated as private. This fixes
one of the issues reported in #170784.

The regressions in the OpenMP V&V and Fujitsu testsuites happened
because the users iterator was apparently becoming invalid, after one of
its uses was replaced. This was fixed by making a copy of the list of
users.
2026-06-01 14:23:50 -03:00
Sjoerd Meijer
2b9a8029af
[LLVM] Nominate Ehsan as a DA maintainer (#200375)
This is related to #200335. I would like to nominate Ehsan as a
maintainer for DependenceAnalysis as I am aware he expressed interest in
that. I am happy that Ryotaro became a maintainer, and if we get one
more maintainer with Ehsan, that is a really good sign of a healthy loop
optimisation community; I think this is a good thing, and support this.

---------

Co-authored-by: Ehsan Amiri <ehsan.amiri@huawei.com>
2026-06-01 13:19:32 -04:00
duk
2b4f07dfa9
[X86] Fix X86FixupLEAs displacement check for other types of operands (#200705)
This has [already bitten us
before](https://github.com/llvm/llvm-project/pull/71641) with
BlockAddresses, but another case popped up recently: under complex
conditions, LEAs in the three-operand case with symbolic displacements
could be miscompiled due to `MO_MCSymbol` not being handled in a similar
way. To avoid other issues in the future, just be more conservative
about the symbol type and only return false if we know for a fact that
the offset is zero.

Fixes #200707
2026-06-01 10:14:43 -07:00
Florian Hahn
668441fbda
[LV] Add VPlan printing test wih UDiv SCEV expansion. (NFC) (#200845) 2026-06-01 18:09:31 +01:00
Nick Sarnie
1f467e7180
[offload][LIT] Disable two tests failing on new Intel GPU driver (#200856)
One new consistent failure and one which causes instability.

Signed-off-by: Nick Sarnie <nick.sarnie@intel.com>
2026-06-01 17:00:17 +00:00
Yaxun (Sam) Liu
5eca8b67ff
[PGO][HIP] Fix profile-only Windows link by gating ROCm interceptor macro (#200859)
PR #200111 stops compiling InstrProfilingPlatformROCm.cpp (which defines
the
HIP GPU helper __llvm_profile_hip_collect_device_data) in profile-only
builds.
But the compile define -DCOMPILER_RT_BUILD_PROFILE_ROCM=1 was still
added
whenever the COMPILER_RT_BUILD_PROFILE_ROCM option was on (the default),
so
InstrProfilingFile.c still referenced the helper from
__llvm_profile_write_file
even though it was never built.

On ELF the declaration is weak, so the undefined symbol folds to null
and the
address-guarded call is skipped. COFF/Windows has no such fallback:

  error LNK2019: unresolved external symbol
  __llvm_profile_hip_collect_device_data referenced in function
  __llvm_profile_write_file

Add the define only when PROFILE_HAS_HIP_INTERCEPTOR is true, i.e. the
same
condition that keeps InstrProfilingPlatformROCm.cpp in the archive, so
the
macro is defined iff the helper is actually compiled in.

Reported by zmodem:
https://github.com/llvm/llvm-project/pull/200111#issuecomment-4593893230
2026-06-01 12:55:15 -04:00
Sergei Druzhkov
09f30ef610
[lldb-dap] Use SetTarget for launch and attach commands (#200133)
Without this patch event listener registration was skipped, as a result
`Modules` view in UI was not displayed in case of launching target via
`launchCommands` or `attachCommands`.
2026-06-01 19:45:50 +03:00