r286129 - [OPENMP] Fixed codegen for __real/__imag expressions in atomic
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 7 11:55:14 PST 2016
Hi Dimitry,
I think so
Best regards,
Alexey Bataev
> 7 нояб. 2016 г., в 22:36, Dimitry Andric <dimitry at andric.com> написал(а):
>
> 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
>
More information about the cfe-commits
mailing list