r286129 - [OPENMP] Fixed codegen for __real/__imag expressions in atomic
Dimitry Andric via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 7 11:35:40 PST 2016
Hi Alexey,
Does this look like a good candidate for 3.9.1?
-Dimitry
> On 07 Nov 2016, at 19:15, Alexey Bataev via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>
> Author: abataev
> Date: Mon Nov 7 12:15:02 2016
> New Revision: 286129
>
> URL: http://llvm.org/viewvc/llvm-project?rev=286129&view=rev
> Log:
> [OPENMP] Fixed codegen for __real/__imag expressions in atomic
> constructs.
>
> For __real/__imag unary expressions clang emits lvalue with the
> associated type from the original complex expression, but not the
> underlying builtin integer or float type. This causes crash in codegen
> for atomic constructs, if __real/__imag expression are used in atomic
> constructs.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGExpr.cpp
> cfe/trunk/test/OpenMP/atomic_write_codegen.c
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=286129&r1=286128&r2=286129&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Nov 7 12:15:02 2016
> @@ -2276,13 +2276,15 @@ LValue CodeGenFunction::EmitUnaryOpLValu
> return LV;
> }
>
> - assert(E->getSubExpr()->getType()->isAnyComplexType());
> + QualType T = ExprTy->castAs<ComplexType>()->getElementType();
>
> Address Component =
> (E->getOpcode() == UO_Real
> ? emitAddrOfRealComponent(LV.getAddress(), LV.getType())
> : emitAddrOfImagComponent(LV.getAddress(), LV.getType()));
> - return MakeAddrLValue(Component, ExprTy, LV.getAlignmentSource());
> + LValue ElemLV = MakeAddrLValue(Component, T, LV.getAlignmentSource());
> + ElemLV.getQuals().addQualifiers(LV.getQuals());
> + return ElemLV;
> }
> case UO_PreInc:
> case UO_PreDec: {
>
> Modified: cfe/trunk/test/OpenMP/atomic_write_codegen.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/atomic_write_codegen.c?rev=286129&r1=286128&r2=286129&view=diff
> ==============================================================================
> --- cfe/trunk/test/OpenMP/atomic_write_codegen.c (original)
> +++ cfe/trunk/test/OpenMP/atomic_write_codegen.c Mon Nov 7 12:15:02 2016
> @@ -78,6 +78,9 @@ float2 float2x;
> register int rix __asm__("esp");
>
> int main() {
> +// CHECK: store atomic i32 1, i32* getelementptr inbounds ({ i32, i32 }, { i32, i32 }* @civ, i32 0, i32 1) monotonic,
> +#pragma omp atomic write
> + __imag(civ) = 1;
> // CHECK: load i8, i8*
> // CHECK: store atomic i8
> #pragma omp atomic write
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161107/98e38a29/attachment.sig>
More information about the cfe-commits
mailing list