mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
COMP: circumvent aggressive compiler branch optimization (clang-17)
- it seems that both sides of the ternary are evaluated despite the divide-by-zero protection. Use volatile to force the compiler to use in-order evaluation.
This commit is contained in:
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011 OpenFOAM Foundation
|
Copyright (C) 2011 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
Copyright (C) 2017-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -417,10 +417,9 @@ inline Foam::vector Foam::edge::unitVec(const UList<point>& pts) const
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const vector v = (pts[second()] - pts[first()]);
|
vector v = (pts[second()] - pts[first()]);
|
||||||
const scalar s(Foam::mag(v));
|
(void) v.normalise(ROOTVSMALL);
|
||||||
|
return v;
|
||||||
return s < ROOTVSMALL ? Zero : v/s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011 OpenFOAM Foundation
|
Copyright (C) 2011 OpenFOAM Foundation
|
||||||
Copyright (C) 2017-2022 OpenCFD Ltd.
|
Copyright (C) 2017-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -103,9 +103,9 @@ inline Foam::pointField Foam::face::points(const UList<point>& pts) const
|
|||||||
|
|
||||||
inline Foam::vector Foam::face::unitNormal(const UList<point>& p) const
|
inline Foam::vector Foam::face::unitNormal(const UList<point>& p) const
|
||||||
{
|
{
|
||||||
const vector n(areaNormal(p));
|
vector n(areaNormal(p));
|
||||||
const scalar s(Foam::mag(n));
|
(void) n.normalise(ROOTVSMALL);
|
||||||
return s < ROOTVSMALL ? Zero : n/s;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -129,6 +129,10 @@ template<class Point, class PointRef>
|
|||||||
inline Point Foam::line<Point, PointRef>::unitVec() const
|
inline Point Foam::line<Point, PointRef>::unitVec() const
|
||||||
{
|
{
|
||||||
const Point v = (b_ - a_);
|
const Point v = (b_ - a_);
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
volatile // Use volatile to avoid aggressive branch optimization
|
||||||
|
#endif
|
||||||
const scalar s(::Foam::mag(v));
|
const scalar s(::Foam::mag(v));
|
||||||
|
|
||||||
return s < ROOTVSMALL ? Zero : v/s;
|
return s < ROOTVSMALL ? Zero : v/s;
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2018-2022 OpenCFD Ltd.
|
Copyright (C) 2018-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -175,9 +175,9 @@ inline Foam::vector Foam::triangle<Point, PointRef>::unitNormal
|
|||||||
const Point& p2
|
const Point& p2
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const vector n(areaNormal(p0, p1, p2));
|
vector n(areaNormal(p0, p1, p2));
|
||||||
const scalar s(::Foam::mag(n));
|
(void) n.normalise(ROOTVSMALL);
|
||||||
return s < ROOTVSMALL ? Zero : n/s;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -120,6 +120,9 @@ inline Foam::scalar Foam::Vector<Cmpt>::dist(const Vector<Cmpt>& v2) const
|
|||||||
template<class Cmpt>
|
template<class Cmpt>
|
||||||
inline Foam::Vector<Cmpt>& Foam::Vector<Cmpt>::normalise(const scalar tol)
|
inline Foam::Vector<Cmpt>& Foam::Vector<Cmpt>::normalise(const scalar tol)
|
||||||
{
|
{
|
||||||
|
#ifdef __clang__
|
||||||
|
volatile // Use volatile to avoid aggressive branch optimization
|
||||||
|
#endif
|
||||||
const scalar s = this->mag();
|
const scalar s = this->mag();
|
||||||
|
|
||||||
if (s < tol)
|
if (s < tol)
|
||||||
|
|||||||
@ -490,6 +490,9 @@ inline VectorSpace<Form, Cmpt, Ncmpts> normalised
|
|||||||
const VectorSpace<Form, Cmpt, Ncmpts>& vs
|
const VectorSpace<Form, Cmpt, Ncmpts>& vs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
#ifdef __clang__
|
||||||
|
volatile // Use volatile to avoid aggressive branch optimization
|
||||||
|
#endif
|
||||||
const scalar s(mag(vs));
|
const scalar s(mag(vs));
|
||||||
return s < ROOTVSMALL ? Zero : vs/s;
|
return s < ROOTVSMALL ? Zero : vs/s;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,6 +210,7 @@ inline complex sqr(const complex& c)
|
|||||||
//- sgn() https://en.wikipedia.org/wiki/Sign_function#Complex_signum
|
//- sgn() https://en.wikipedia.org/wiki/Sign_function#Complex_signum
|
||||||
inline complex sign(const complex& c)
|
inline complex sign(const complex& c)
|
||||||
{
|
{
|
||||||
|
// TBD: Use volatile to avoid aggressive branch optimization
|
||||||
const scalar s(mag(c));
|
const scalar s(mag(c));
|
||||||
return s < ROOTVSMALL ? Zero : c/s;
|
return s < ROOTVSMALL ? Zero : c/s;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2019-2022 OpenCFD Ltd.
|
Copyright (C) 2019-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -215,7 +215,7 @@ public:
|
|||||||
|
|
||||||
//- Inplace normalise the quaternion by its magnitude
|
//- Inplace normalise the quaternion by its magnitude
|
||||||
// For small magnitudes (less than ROOTVSMALL) set to zero.
|
// For small magnitudes (less than ROOTVSMALL) set to zero.
|
||||||
inline quaternion& normalise();
|
inline quaternion& normalise(const scalar tol = ROOTVSMALL);
|
||||||
|
|
||||||
|
|
||||||
// Transform
|
// Transform
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2019-2022 OpenCFD Ltd.
|
Copyright (C) 2019-2023 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -306,13 +306,14 @@ inline Foam::vector& Foam::quaternion::v() noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline Foam::quaternion& Foam::quaternion::normalise()
|
inline Foam::quaternion& Foam::quaternion::normalise(const scalar tol)
|
||||||
{
|
{
|
||||||
|
// TBD: Use volatile to avoid aggressive branch optimization
|
||||||
const scalar s(Foam::mag(*this));
|
const scalar s(Foam::mag(*this));
|
||||||
|
|
||||||
if (s < ROOTVSMALL)
|
if (s < tol)
|
||||||
{
|
{
|
||||||
*this = Zero;
|
*this = Foam::zero{};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -68,6 +68,7 @@ static inline vector areaInvDistSqrWeightedNormal
|
|||||||
const vector& b
|
const vector& b
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
// TBD: Use volatile to avoid aggressive branch optimization
|
||||||
const scalar s(2*magSqr(a)*magSqr(b));
|
const scalar s(2*magSqr(a)*magSqr(b));
|
||||||
|
|
||||||
return s < ROOTVSMALL ? Zero : (a ^ b) / s;
|
return s < ROOTVSMALL ? Zero : (a ^ b) / s;
|
||||||
|
|||||||
Reference in New Issue
Block a user