llvmbot wrote:
@llvm/pr-subscribers-flang-parser
Author: Krzysztof Parzyszek (kparzysz)
Changes
Add METADIRECTIVE to the OpenMP declarative constructs as well. Emit a TODO
error for both declarative and executable cases.
---
Full diff: https://github.com/llvm/llvm-project/pull/123397.dif
https://github.com/kparzysz created
https://github.com/llvm/llvm-project/pull/123397
Add METADIRECTIVE to the OpenMP declarative constructs as well. Emit a TODO
error for both declarative and executable cases.
>From 7fa026c6561020669f42b94fb474648f59fb1e7a Mon Sep 17 00:00:00 2001
From: Krzysz
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
https://github.com/sergey-kozub approved this pull request.
https://github.com/llvm/llvm-project/pull/123326
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
https://github.com/hekota created
https://github.com/llvm/llvm-project/pull/123411
Introduces a new address space `hlsl_constant(2)` for constant buffer
declarations.
This address space is applied to declarations inside `cbuffer` block. Later on,
it will also be applied to `ConstantBuffer` sy
https://github.com/hekota edited
https://github.com/llvm/llvm-project/pull/123411
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
https://github.com/inbelic edited
https://github.com/llvm/llvm-project/pull/122982
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
https://github.com/inbelic updated
https://github.com/llvm/llvm-project/pull/122982
>From 58ef8ad2d3d9bfa008745b35f1514222c13b773a Mon Sep 17 00:00:00 2001
From: Finn Plummer
Date: Tue, 14 Jan 2025 22:23:22 +
Subject: [PATCH 1/3] [HLSL][RootSignature] Implement Parsing of Descriptor
Tables
@@ -455,14 +456,22 @@ void createHostLayoutStructForBuffer(Sema &S,
HLSLBufferDecl *BufDecl) {
LS->setImplicit(true);
LS->startDefinition();
- for (const Decl *D : BufDecl->decls()) {
-const VarDecl *VD = dyn_cast(D);
+ for (Decl *D : BufDecl->decls()) {
+VarDec
https://github.com/tex3d edited https://github.com/llvm/llvm-project/pull/123411
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
@@ -83,6 +83,7 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr32_uptr
llvm::AMDGPUAS::FLAT_ADDRESS, // ptr64
llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_groupshared
+llvm::AMDGPUAS::FLAT_ADDRESS, // hlsl_constant
--
@@ -2556,6 +2556,8 @@ std::string Qualifiers::getAddrSpaceAsString(LangAS AS) {
return "__funcref";
case LangAS::hlsl_groupshared:
return "groupshared";
+ case LangAS::hlsl_constant:
+return "hlsl_constant";
tex3d wrote:
Should hlsl addrspace ca
@@ -43,8 +43,8 @@ tbuffer B {
// AST-NEXT: FullComment
// AST-NEXT: ParagraphComment
// AST-NEXT: TextComment {{.*}} Text=" CBuffer decl."
-// AST-NEXT: VarDecl {{.*}} a 'float'
-// AST-NEXT: VarDecl {{.*}} b 'int'
+// AST-NEXT: VarDecl {{.*}} a 'hlsl_constant float'
+// AST-NE
@@ -42,6 +42,7 @@ static const unsigned DirectXAddrSpaceMap[] = {
0, // ptr32_uptr
0, // ptr64
3, // hlsl_groupshared
+2, // hlsl_constant
tex3d wrote:
I'm surprised we neither use the `LangASMap` type for this array, nor
static_assert that th
@@ -39,7 +39,7 @@ typedef float EmptyArrayTypedef[10][0];
// CHECK: HLSLResourceClassAttr {{.*}} Implicit CBuffer
// CHECK: HLSLResourceAttr {{.*}} Implicit CBuffer
cbuffer CB {
- // CHECK: VarDecl {{.*}} col:9 used a1 'float'
+ // CHECK: VarDecl {{.*}} col:9 used a1 'hlsl_co
https://github.com/tex3d commented:
I think this looks good, though I had some questions.
Looks like a test update is needed:
```
error: 'expected-error' diagnostics expected but not seen:
File
/var/lib/buildkite-agent/builds/linux-56-59b8f5d88-q72qr-1/llvm-project/github-pull-requests/clang
@@ -1750,7 +1750,9 @@ void
MappingTraits>::mapping(
std::string MappingTraits>::validate(
IO &io, std::unique_ptr &C) {
if (const auto *F = dyn_cast(C.get())) {
-if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size)
+// Can't check the `Size`, as it's req
https://github.com/joaosaffran updated
https://github.com/llvm/llvm-project/pull/123147
>From 916b2f17afef4e7b79818596551df44c75a55016 Mon Sep 17 00:00:00 2001
From: joaosaffran
Date: Thu, 16 Jan 2025 22:16:45 +
Subject: [PATCH 01/12] addressing pr comments
---
llvm/include/llvm/BinaryFor
llvmbot wrote:
@llvm/pr-subscribers-clang-format
Author: None (llvmbot)
Changes
Backport a7bca1861bfcd1490319115c1027166e27f4ae27
Requested by: @owenca
---
Full diff: https://github.com/llvm/llvm-project/pull/123439.diff
3 Files Affected:
- (modified) clang/lib/Format/UnwrappedLinePar
https://github.com/llvmbot created
https://github.com/llvm/llvm-project/pull/123439
Backport a7bca1861bfcd1490319115c1027166e27f4ae27
Requested by: @owenca
>From b81158025235d50f1eb227ded9f5638f039c59e2 Mon Sep 17 00:00:00 2001
From: Owen Pan
Date: Fri, 17 Jan 2025 19:26:00 -0800
Subject: [PA
https://github.com/llvmbot milestoned
https://github.com/llvm/llvm-project/pull/123439
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
llvmbot wrote:
@mydeveloperday What do you think about merging this PR to the release branch?
https://github.com/llvm/llvm-project/pull/123439
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailma
https://github.com/Meinersbur updated
https://github.com/llvm/llvm-project/pull/121782
>From a3037ab5557dcc4a4deb5bb40f801ca9770e3854 Mon Sep 17 00:00:00 2001
From: Michael Kruse
Date: Mon, 6 Jan 2025 16:44:08 +0100
Subject: [PATCH 1/7] Add FLANG_RT_ENABLE_STATIC and FLANG_RT_ENABLE_SHARED
---
https://github.com/Meinersbur updated
https://github.com/llvm/llvm-project/pull/122336
>From dd3ac2e6d8d8d57cd639c25bea3b8d5c99a2f81e Mon Sep 17 00:00:00 2001
From: Michael Kruse
Date: Thu, 9 Jan 2025 15:58:48 +0100
Subject: [PATCH 1/8] Introduce FLANG_INCLUDE_RUNTIME
---
flang/CMakeLists.txt
https://github.com/Meinersbur updated
https://github.com/llvm/llvm-project/pull/122341
>From c77098f90a5c20bdbce078a0ee3aec1fe53772e3 Mon Sep 17 00:00:00 2001
From: Michael Kruse
Date: Wed, 8 Jan 2025 11:23:02 +0100
Subject: [PATCH 1/4] clang-format to sort headers
---
flang/tools/f18-parse-d
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -1750,7 +1750,9 @@ void
MappingTraits>::mapping(
std::string MappingTraits>::validate(
IO &io, std::unique_ptr &C) {
if (const auto *F = dyn_cast(C.get())) {
-if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size)
+// Can't check the `Size`, as it's req
Author: Michał Górny
Date: 2025-01-18T07:59:09Z
New Revision: ce83c9470ba1a9860c107d39e60d9148ac009e91
URL:
https://github.com/llvm/llvm-project/commit/ce83c9470ba1a9860c107d39e60d9148ac009e91
DIFF:
https://github.com/llvm/llvm-project/commit/ce83c9470ba1a9860c107d39e60d9148ac009e91.diff
LOG:
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
https://github.com/mingmingl-llvm updated
https://github.com/llvm/llvm-project/pull/122215
>From dd748277dff2b30ed02bfa466eeca7102aa93eb4 Mon Sep 17 00:00:00 2001
From: mingmingl
Date: Fri, 10 Jan 2025 13:53:08 -0800
Subject: [PATCH 1/9] rely to upstream
---
llvm/include/llvm/CodeGen/MachineF
https://github.com/mingmingl-llvm edited
https://github.com/llvm/llvm-project/pull/122215
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
@@ -2876,42 +2875,101 @@ void AsmPrinter::emitJumpTableInfo() {
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference64,
F);
+
+ std::vector JumpTableIndices;
+ if (!TM.Opti
https://github.com/mingmingl-llvm commented:
thanks for the feedback! PTAL.
https://github.com/llvm/llvm-project/pull/122215
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-br
https://github.com/mingmingl-llvm updated
https://github.com/llvm/llvm-project/pull/122215
>From dd748277dff2b30ed02bfa466eeca7102aa93eb4 Mon Sep 17 00:00:00 2001
From: mingmingl
Date: Fri, 10 Jan 2025 13:53:08 -0800
Subject: [PATCH 1/7] rely to upstream
---
llvm/include/llvm/CodeGen/MachineF
llvmbot wrote:
@llvm/pr-subscribers-backend-webassembly
@llvm/pr-subscribers-clang-codegen
Author: Helena Kotas (hekota)
Changes
Introduces a new address space `hlsl_constant(2)` for constant buffer
declarations.
This address space is applied to declarations inside `cbuffer` block. Later
llvmbot wrote:
@llvm/pr-subscribers-backend-directx
Author: Helena Kotas (hekota)
Changes
Introduces a new address space `hlsl_constant(2)` for constant buffer
declarations.
This address space is applied to declarations inside `cbuffer` block. Later on,
it will also be applied to `Const
llvmbot wrote:
@llvm/pr-subscribers-backend-systemz
Author: Helena Kotas (hekota)
Changes
Introduces a new address space `hlsl_constant(2)` for constant buffer
declarations.
This address space is applied to declarations inside `cbuffer` block. Later on,
it will also be applied to `Const
@@ -100,22 +100,6 @@ GlobalVariable *replaceBuffer(CGHLSLRuntime::Buffer &Buf) {
llvm::formatv("{0}{1}", Buf.Name, Buf.IsCBuffer ? ".cb." : ".tb."),
GlobalValue::NotThreadLocal);
- IRBuilder<> B(CBGV->getContext());
- Value *ZeroIdx = B.getInt32(0);
- // Replace
https://github.com/hekota ready_for_review
https://github.com/llvm/llvm-project/pull/123411
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
@@ -1750,7 +1750,9 @@ void
MappingTraits>::mapping(
std::string MappingTraits>::validate(
IO &io, std::unique_ptr &C) {
if (const auto *F = dyn_cast(C.get())) {
-if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size)
+// Can't check the `Size`, as it's req
@@ -8,6 +8,12 @@
macro(enable_cuda_compilation name files)
if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA")
+if (NOT FLANG_RT_ENABLE_STATIC)
+ message(FATAL_ERROR
+"FLANG_RT_ENABLE_STATIC is required for CUDA build of Flang-RT"
+)
+endi
@@ -0,0 +1,43 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
UTC_ARGS: --version 5
+# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100
-run-pass=early-machinelicm,si-wqm -o - %s | FileCheck -check-prefix=GCN %s
+
rampitec wrot
https://github.com/rampitec updated
https://github.com/llvm/llvm-project/pull/123234
>From 7501423b29230f37273094e1b15e8bca0fcc90bd Mon Sep 17 00:00:00 2001
From: Stanislav Mekhanoshin
Date: Thu, 16 Jan 2025 10:49:05 -0800
Subject: [PATCH] [AMDGPU] Add test for VALU hoisiting from WWM region. N
@@ -1,47 +1,34 @@
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
-add_library(FortranEvaluateTesting
jeanPerier wrote:
I am hitting the following error with my build: `g++: error: unrecognized
command line option ‘--offload-arch=native’` at the
@@ -2773,6 +2773,9 @@ void AMDGPUDAGToDAGISel::SelectINTRINSIC_WO_CHAIN(SDNode
*N) {
case Intrinsic::amdgcn_wwm:
case Intrinsic::amdgcn_strict_wwm:
Opcode = AMDGPU::STRICT_WWM;
+CurDAG->getMachineFunction()
+.getInfo()
+->setInitWholeWave();
---
Author: Kiran Chandramohan
Date: 2025-01-17T12:27:25Z
New Revision: 790a6e1399ee90ae802878dcb00c0e2a1d464d69
URL:
https://github.com/llvm/llvm-project/commit/790a6e1399ee90ae802878dcb00c0e2a1d464d69
DIFF:
https://github.com/llvm/llvm-project/commit/790a6e1399ee90ae802878dcb00c0e2a1d464d69.diff
HerrCai0907 wrote:
### Merge activity
* **Jan 17, 8:39 AM EST**: A user started a stack merge that includes this pull
request via
[Graphite](https://app.graphite.dev/github/pr/llvm/llvm-project/122909).
https://github.com/llvm/llvm-project/pull/122909
@@ -1,47 +1,34 @@
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
-add_library(FortranEvaluateTesting
jhuber6 wrote:
Does anyone use the omp offload build? I'm hoping to make that unnecessary once
we have the flang-rt build working.
https://git
@@ -151,3 +151,17 @@ define void @pointer_cmpxchg_expand6(ptr addrspace(1) %ptr,
ret void
}
+define <2 x ptr> @atomic_vec2_ptr_align(ptr %x) nounwind {
+; CHECK-LABEL: @atomic_vec2_ptr_align(
+; CHECK-NEXT:[[TMP1:%.*]] = call i128 @__atomic_load_16(ptr [[X:%.*]], i32
2)
Author: Cullen Rhodes
Date: 2025-01-17T15:29:43Z
New Revision: 74673b37ef5226ddd1a3216075e48ac75509525a
URL:
https://github.com/llvm/llvm-project/commit/74673b37ef5226ddd1a3216075e48ac75509525a
DIFF:
https://github.com/llvm/llvm-project/commit/74673b37ef5226ddd1a3216075e48ac75509525a.diff
LOG:
rampitec wrote:
> I guess my concern is performance regressions if any use of WWM (e.g. atomic
> optimizer) essentially turns off Machine LICM.
I agree. But when moving the code llvm thinks it is something cheap, and its is
not, which is also a performance problem. Things would be much easier
@@ -1750,7 +1750,9 @@ void
MappingTraits>::mapping(
std::string MappingTraits>::validate(
IO &io, std::unique_ptr &C) {
if (const auto *F = dyn_cast(C.get())) {
-if (F->Pattern && F->Pattern->binary_size() != 0 && !F->Size)
+// Can't check the `Size`, as it's req
https://github.com/River707 approved this pull request.
https://github.com/llvm/llvm-project/pull/123326
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
https://github.com/kuhar approved this pull request.
Nice!
https://github.com/llvm/llvm-project/pull/123326
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
https://github.com/rampitec edited
https://github.com/llvm/llvm-project/pull/123124
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
@@ -0,0 +1,950 @@
+//===- Construction of code generation pass pipelines
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Ap
@@ -0,0 +1,950 @@
+//===- Construction of code generation pass pipelines
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Ap
@@ -0,0 +1,950 @@
+//===- Construction of code generation pass pipelines
-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Ap
Author: Sushant Gokhale
Date: 2025-01-17T02:04:01-08:00
New Revision: ba06cf81896f7a5ea8d025c1b26af7ea4a47dc53
URL:
https://github.com/llvm/llvm-project/commit/ba06cf81896f7a5ea8d025c1b26af7ea4a47dc53
DIFF:
https://github.com/llvm/llvm-project/commit/ba06cf81896f7a5ea8d025c1b26af7ea4a47dc53.dif
@@ -2773,6 +2773,9 @@ void AMDGPUDAGToDAGISel::SelectINTRINSIC_WO_CHAIN(SDNode
*N) {
case Intrinsic::amdgcn_wwm:
case Intrinsic::amdgcn_strict_wwm:
Opcode = AMDGPU::STRICT_WWM;
+CurDAG->getMachineFunction()
+.getInfo()
+->setInitWholeWave();
---
https://github.com/matthias-springer created
https://github.com/llvm/llvm-project/pull/123326
Remove `type.isFloat4E2M1FN()` etc. Use `isa(type)` instead.
For details, see:
https://discourse.llvm.org/t/rethink-on-approach-to-low-precision-fp-types/82361/28
Depends on #123321.
>From 55825a99
llvmbot wrote:
@llvm/pr-subscribers-backend-amdgpu
Author: Matthias Springer (matthias-springer)
Changes
Remove `type.isFloat4E2M1FN()` etc. Use `isa(type)`
instead.
For details, see:
https://discourse.llvm.org/t/rethink-on-approach-to-low-precision-fp-types/82361/28
https://github.com/jplehr approved this pull request.
I did not find issues when running this through a couple of configurations I
typically use.
https://github.com/llvm/llvm-project/pull/122069
___
llvm-branch-commits mailing list
llvm-branch-commits
72 matches
Mail list logo