aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen
diff options
context:
space:
mode:
authorGravatar Chip Kerchner <chip.kerchner@ibm.com>2021-04-02 16:27:08 +0000
committerGravatar David Tellenbach <david.tellenbach@me.com>2021-04-02 16:27:08 +0000
commitc24bee6120d40987b15df0cbdaaa60e3de877e01 (patch)
tree0e5f00f31149782e02565c2b60b0d6653b6934f7 /Eigen
parente4233b6e3d378b57bfccda8e60f95cfc42f7856e (diff)
Fix address of temporary object errors in clang11.
This fixes the problem with taking the address of temporary objects which clang11 treats as errors.
Diffstat (limited to 'Eigen')
-rw-r--r--Eigen/src/Core/arch/AltiVec/Complex.h4
-rw-r--r--Eigen/src/Core/arch/AltiVec/MatrixProduct.h57
-rw-r--r--Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h2
3 files changed, 27 insertions, 36 deletions
diff --git a/Eigen/src/Core/arch/AltiVec/Complex.h b/Eigen/src/Core/arch/AltiVec/Complex.h
index 8110f53d0..c6cb59e8f 100644
--- a/Eigen/src/Core/arch/AltiVec/Complex.h
+++ b/Eigen/src/Core/arch/AltiVec/Complex.h
@@ -139,8 +139,8 @@ EIGEN_STRONG_INLINE Packet2cf pload2(const std::complex<float>* from0, const std
__asm__ ("xxpermdi %x0, %x2, %x1, 0" : "=wa" (res0) : "wa" (res0), "wa" (res1));
#endif
#else
- *((std::complex<float> *)&res0[0]) = *from0;
- *((std::complex<float> *)&res1[0]) = *from1;
+ *reinterpret_cast<std::complex<float> *>(&res0) = *from0;
+ *reinterpret_cast<std::complex<float> *>(&res1) = *from1;
res0 = vec_perm(res0, res1, p16uc_TRANSPOSE64_HI);
#endif
return Packet2cf(res0);
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProduct.h b/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
index 30b814241..e3ba06159 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProduct.h
@@ -486,19 +486,28 @@ struct dhs_cpack {
if(((StorageOrder == ColMajor) && UseLhs) || (((StorageOrder == RowMajor) && !UseLhs)))
{
if (UseLhs) {
- cblock.packet[0] = pload<PacketC>(&lhs(j + 0, i));
- cblock.packet[1] = pload<PacketC>(&lhs(j + 2, i));
+ cblock.packet[0] = lhs.template loadPacket<PacketC>(j + 0, i);
+ cblock.packet[1] = lhs.template loadPacket<PacketC>(j + 2, i);
} else {
- cblock.packet[0] = pload<PacketC>(&lhs(i, j + 0));
- cblock.packet[1] = pload<PacketC>(&lhs(i, j + 2));
+ cblock.packet[0] = lhs.template loadPacket<PacketC>(i, j + 0);
+ cblock.packet[1] = lhs.template loadPacket<PacketC>(i, j + 2);
}
} else {
+ const std::complex<Scalar> *lhs0, *lhs1;
if (UseLhs) {
- cblock.packet[0] = pload2(&lhs(j + 0, i), &lhs(j + 1, i));
- cblock.packet[1] = pload2(&lhs(j + 2, i), &lhs(j + 3, i));
+ lhs0 = &lhs(j + 0, i);
+ lhs1 = &lhs(j + 1, i);
+ cblock.packet[0] = pload2(lhs0, lhs1);
+ lhs0 = &lhs(j + 2, i);
+ lhs1 = &lhs(j + 3, i);
+ cblock.packet[1] = pload2(lhs0, lhs1);
} else {
- cblock.packet[0] = pload2(&lhs(i, j + 0), &lhs(i, j + 1));
- cblock.packet[1] = pload2(&lhs(i, j + 2), &lhs(i, j + 3));
+ lhs0 = &lhs(i, j + 0);
+ lhs1 = &lhs(i, j + 1);
+ cblock.packet[0] = pload2(lhs0, lhs1);
+ lhs0 = &lhs(i, j + 2);
+ lhs1 = &lhs(i, j + 3);
+ cblock.packet[1] = pload2(lhs0, lhs1);
}
}
@@ -859,8 +868,8 @@ struct dhs_cpack<double, Index, DataMapper, Packet, PacketC, StorageOrder, Conju
PacketBlock<Packet,1> blockr, blocki;
PacketBlock<PacketC,2> cblock;
- cblock.packet[0] = pload<PacketC>(&lhs(j + 0, i));
- cblock.packet[1] = pload<PacketC>(&lhs(j + 1, i));
+ cblock.packet[0] = lhs.template loadPacket<PacketC>(j + 0, i);
+ cblock.packet[1] = lhs.template loadPacket<PacketC>(j + 1, i);
blockr.packet[0] = vec_perm(cblock.packet[0].v, cblock.packet[1].v, p16uc_GETREAL64);
blocki.packet[0] = vec_perm(cblock.packet[0].v, cblock.packet[1].v, p16uc_GETIMAG64);
@@ -1100,7 +1109,7 @@ EIGEN_STRONG_INLINE void pgerc(PacketBlock<Packet,N>* accReal, PacketBlock<Packe
template<typename Scalar, typename Packet>
EIGEN_STRONG_INLINE Packet ploadLhs(const Scalar* lhs)
{
- return *((Packet *)lhs);
+ return *reinterpret_cast<Packet *>(const_cast<Scalar *>(lhs));
}
// Zero the accumulator on PacketBlock.
@@ -1799,24 +1808,6 @@ EIGEN_STRONG_INLINE void MICRO_COMPLEX_EXTRA_COL(
else EIGEN_UNUSED_VARIABLE(rhs_ptr_imag);
}
-template<typename Scalar, typename Packetc, typename Index, const Index accCols>
-EIGEN_STRONG_INLINE void pstore_add_half(std::complex<Scalar>* to, Packetc &from)
-{
-#ifdef __VSX__
- Packetc from2;
-#ifndef _BIG_ENDIAN
- __asm__ ("xxswapd %x0, %x0" : : "wa" (from.v));
-#endif
- __asm__ ("lxsdx %x0,%y1" : "=wa" (from2.v) : "Z" (*to));
- from2 += from;
- __asm__ ("stxsdx %x0,%y1" : : "wa" (from2.v), "Z" (*to));
-#else
- std::complex<Scalar> mem[accColsC];
- pstoreu<std::complex<Scalar> >(mem, from);
- *to += *mem;
-#endif
-}
-
template<typename Scalar, typename Packet, typename Packetc, typename DataMapper, typename Index, const Index accRows, const Index accCols, bool ConjugateLhs, bool ConjugateRhs, bool LhsIsReal, bool RhsIsReal>
EIGEN_STRONG_INLINE void gemm_complex_extra_col(
const DataMapper& res,
@@ -1886,12 +1877,12 @@ EIGEN_STRONG_INLINE void gemm_complex_extra_col(
if ((sizeof(Scalar) == sizeof(float)) && (remaining_rows == 1))
{
- pstore_add_half<Scalar, Packetc, Index, accCols>(&res(row + 0, col + 0), acc0.packet[0]);
+ res(row + 0, col + 0) += pfirst<Packetc>(acc0.packet[0]);
} else {
acc0.packet[0] += res.template loadPacket<Packetc>(row + 0, col + 0);
res.template storePacketBlock<Packetc,1>(row + 0, col + 0, acc0);
if(remaining_rows > accColsC) {
- pstore_add_half<Scalar, Packetc, Index, accCols>(&res(row + accColsC, col + 0), acc1.packet[0]);
+ res(row + accColsC, col + 0) += pfirst<Packetc>(acc1.packet[0]);
}
}
}
@@ -1997,7 +1988,7 @@ asm("#gemm_complex begin");
if ((sizeof(Scalar) == sizeof(float)) && (remaining_rows == 1))
{
for(Index j = 0; j < 4; j++) {
- pstore_add_half<Scalar, Packetc, Index, accCols>(&res(row + 0, col + j), acc0.packet[j]);
+ res(row + 0, col + j) += pfirst<Packetc>(acc0.packet[j]);
}
} else {
for(Index j = 0; j < 4; j++) {
@@ -2005,7 +1996,7 @@ asm("#gemm_complex begin");
acc2.packet[0] = res.template loadPacket<Packetc>(row + 0, col + j) + acc0.packet[j];
res.template storePacketBlock<Packetc,1>(row + 0, col + j, acc2);
if(remaining_rows > accColsC) {
- pstore_add_half<Scalar, Packetc, Index, accCols>(&res(row + accColsC, col + j), acc1.packet[j]);
+ res(row + accColsC, col + j) += pfirst<Packetc>(acc1.packet[j]);
}
}
}
diff --git a/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h b/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
index 024767868..6e74116b9 100644
--- a/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
+++ b/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h
@@ -214,7 +214,7 @@ EIGEN_STRONG_INLINE void bcouple_common<Packet2d, Packet1cd>(PacketBlock<Packet2
template<typename Scalar, typename Packet>
EIGEN_STRONG_INLINE Packet ploadRhs(const Scalar* rhs)
{
- return *((Packet *)rhs);
+ return *reinterpret_cast<Packet *>(const_cast<Scalar *>(rhs));
}
} // end namespace internal