r286098 - [OPENMP] Fixed capturing of VLA variables.

Diana Picus via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 7 02:07:54 PST 2016


Hi Alexey,

If it is not a simple, quick fix that you can do, it is customary to revert
so the buildbots become green again. Otherwise, if people commit other
things that break the build they will not get emails and it will be much
harder to fix the whole thing.

I'll revert this for you and you can commit the fixed version later on,
when it's ready.

Thanks,
Diana

On 7 November 2016 at 11:54, Alexey Bataev <a.bataev at hotmail.com> wrote:

> Hi Diana, will fix it in couple hours.
>
> Best regards,
> Alexey Bataev
>
> 7 нояб. 2016 г., в 12:38, Diana Picus <diana.picus at linaro.org> написал(а):
>
> Hi,
>
> This has been breaking the bots for almost an hour. Can you fix/revert?
>
> http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15/builds/304
> http://lab.llvm.org:8011/builders/clang-hexagon-elf/builds/657
> http://lab.llvm.org:8011/builders/clang-x86-windows-msvc2015/builds/347
>
> Thanks,
> Diana
>
> On 7 November 2016 at 10:07, Alexey Bataev via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: abataev
>> Date: Mon Nov  7 02:07:25 2016
>> New Revision: 286098
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=286098&view=rev
>> Log:
>> [OPENMP] Fixed capturing of VLA variables.
>>
>> After some changes in codegen capturing of VLA variables in OpenMP
>> regions was broken, causing compiler crash. Patch fixes this issue.
>>
>> Modified:
>>     cfe/trunk/lib/CodeGen/CGExpr.cpp
>>     cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
>>     cfe/trunk/test/OpenMP/parallel_codegen.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CG
>> Expr.cpp?rev=286098&r1=286097&r2=286098&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Nov  7 02:07:25 2016
>> @@ -2127,12 +2127,11 @@ LValue CodeGenFunction::EmitDeclRefLValu
>>        if (auto *FD = LambdaCaptureFields.lookup(VD))
>>          return EmitCapturedFieldLValue(*this, FD, CXXABIThisValue);
>>        else if (CapturedStmtInfo) {
>> -        auto it = LocalDeclMap.find(VD);
>> -        if (it != LocalDeclMap.end()) {
>> -          if (auto RefTy = VD->getType()->getAs<ReferenceType>()) {
>> -            return EmitLoadOfReferenceLValue(it->second, RefTy);
>> -          }
>> -          return MakeAddrLValue(it->second, T);
>> +        auto I = LocalDeclMap.find(VD);
>> +        if (I != LocalDeclMap.end()) {
>> +          if (auto RefTy = VD->getType()->getAs<ReferenceType>())
>> +            return EmitLoadOfReferenceLValue(I->second, RefTy);
>> +          return MakeAddrLValue(I->second, T);
>>          }
>>          LValue CapLVal =
>>              EmitCapturedFieldLValue(*this, CapturedStmtInfo->lookup(VD),
>>
>> Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CG
>> StmtOpenMP.cpp?rev=286098&r1=286097&r2=286098&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Mon Nov  7 02:07:25 2016
>> @@ -307,7 +307,7 @@ CodeGenFunction::GenerateOpenMPCapturedS
>>          if (ArgLVal.getType()->isLValueReferenceType()) {
>>            ArgAddr = EmitLoadOfReference(
>>                ArgAddr, ArgLVal.getType()->castAs<ReferenceType>());
>> -        } else {
>> +        } else if (!VarTy->isVariablyModifiedType() ||
>> !VarTy->isPointerType()) {
>>            assert(ArgLVal.getType()->isPointerType());
>>            ArgAddr = EmitLoadOfPointer(
>>                ArgAddr, ArgLVal.getType()->castAs<PointerType>());
>>
>> Modified: cfe/trunk/test/OpenMP/parallel_codegen.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/pa
>> rallel_codegen.cpp?rev=286098&r1=286097&r2=286098&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/OpenMP/parallel_codegen.cpp (original)
>> +++ cfe/trunk/test/OpenMP/parallel_codegen.cpp Mon Nov  7 02:07:25 2016
>> @@ -10,7 +10,7 @@
>>  // CHECK-DEBUG-DAG: %ident_t = type { i32, i32, i32, i32, i8* }
>>  // CHECK-DEBUG-DAG: [[STR:@.+]] = private unnamed_addr constant [23 x
>> i8] c";unknown;unknown;0;0;;\00"
>>  // CHECK-DEBUG-DAG: [[DEF_LOC_2:@.+]] = private unnamed_addr constant
>> %ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x
>> i8], [23 x i8]* [[STR]], i32 0, i32 0) }
>> -// CHECK-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant
>> [{{.+}} x i8] c";{{.*}}parallel_codegen.cpp;main;[[@LINE+14]];9;;\00"
>> +// CHECK-DEBUG-DAG: [[LOC1:@.+]] = private unnamed_addr constant
>> [{{.+}} x i8] c";{{.*}}parallel_codegen.cpp;main;[[@LINE+15]];9;;\00"
>>  // CHECK-DEBUG-DAG: [[LOC2:@.+]] = private unnamed_addr constant
>> [{{.+}} x i8] c";{{.*}}parallel_codegen.cpp;tmain;[[@LINE+7]];9;;\00"
>>
>>  template <class T>
>> @@ -24,17 +24,19 @@ int tmain(T argc) {
>>  }
>>
>>  int main (int argc, char **argv) {
>> +  int a[argc];
>>  #pragma omp parallel
>> -  foo(argc);
>> +  foo(a[1]);
>>    return tmain(argv);
>>  }
>>
>>  // CHECK-LABEL: define {{[a-z\_\b]*[ ]?i32}} @main({{i32[ ]?[a-z]*}}
>> %argc, i8** %argv)
>>  // CHECK: store i32 %argc, i32* [[ARGC_ADDR:%.+]],
>> -// CHECK:  call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*,
>> ...) @__kmpc_fork_call(%ident_t* [[DEF_LOC_2]], i32 1, void (i32*, i32*,
>> ...)* bitcast (void (i32*, i32*, i32*)* [[OMP_OUTLINED:@.+]] to void
>> (i32*, i32*, ...)*), i32* [[ARGC_ADDR]])
>> +// CHECK: [[VLA:%.+]] = alloca i32, i64 [[VLA_SIZE:%[^,]+]],
>> +// CHECK:  call {{.*}}void (%ident_t*, i32, void (i32*, i32*, ...)*,
>> ...) @__kmpc_fork_call(%ident_t* [[DEF_LOC_2]], i32 2, void (i32*, i32*,
>> ...)* bitcast (void (i32*, i32*, i64, i32*)* [[OMP_OUTLINED:@.+]] to
>> void (i32*, i32*, ...)*), i64 [[VLA_SIZE]], i32* [[VLA]])
>>  // CHECK-NEXT:  [[ARGV:%.+]] = load i8**, i8*** {{%[a-z0-9.]+}}
>>  // CHECK-NEXT:  [[RET:%.+]] = call {{[a-z\_\b]*[ ]?i32}} [[TMAIN:@.+tmain.+]](i8**
>> [[ARGV]])
>> -// CHECK-NEXT:  ret i32 [[RET]]
>> +// CHECK:       ret i32
>>  // CHECK-NEXT:  }
>>  // CHECK-DEBUG-LABEL: define i32 @main(i32 %argc, i8** %argv)
>>  // CHECK-DEBUG:       [[LOC_2_ADDR:%.+]] = alloca %ident_t
>> @@ -42,30 +44,33 @@ int main (int argc, char **argv) {
>>  // CHECK-DEBUG-NEXT:  [[KMPC_DEFAULT_LOC_VOIDPTR:%.+]] = bitcast
>> %ident_t* [[DEF_LOC_2]] to i8*
>>  // CHECK-DEBUG-NEXT:   call void @llvm.memcpy.p0i8.p0i8.i64(i8*
>> [[KMPC_LOC_VOIDPTR]], i8* [[KMPC_DEFAULT_LOC_VOIDPTR]], i64 24, i32 8, i1
>> false)
>>  // CHECK-DEBUG:       store i32 %argc, i32* [[ARGC_ADDR:%.+]],
>> +// CHECK-DEBUG:       [[VLA:%.+]] = alloca i32, i64 [[VLA_SIZE:%[^,]+]],
>>  // CHECK-DEBUG:       [[KMPC_LOC_PSOURCE_REF:%.+]] = getelementptr
>> inbounds %ident_t, %ident_t* [[LOC_2_ADDR]], i32 0, i32 4
>>  // CHECK-DEBUG-NEXT:  store i8* getelementptr inbounds ([{{.+}} x i8],
>> [{{.+}} x i8]* [[LOC1]], i32 0, i32 0), i8** [[KMPC_LOC_PSOURCE_REF]]
>> -// CHECK-DEBUG:  call {{.*}}void (%ident_t*, i32, void (i32*, i32*,
>> ...)*, ...) @__kmpc_fork_call(%ident_t* [[LOC_2_ADDR]], i32 1, void (i32*,
>> i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OMP_OUTLINED:@.+]] to
>> void (i32*, i32*, ...)*), i32* [[ARGC_ADDR]])
>> +// CHECK-DEBUG:       call {{.*}}void (%ident_t*, i32, void (i32*, i32*,
>> ...)*, ...) @__kmpc_fork_call(%ident_t* [[LOC_2_ADDR]], i32 2, void (i32*,
>> i32*, ...)* bitcast (void (i32*, i32*, i64, i32*)* [[OMP_OUTLINED:@.+]]
>> to void (i32*, i32*, ...)*), i64 [[VLA_SIZE]], i32* [[VLA]])
>>  // CHECK-DEBUG-NEXT:  [[ARGV:%.+]] = load i8**, i8*** {{%[a-z0-9.]+}}
>>  // CHECK-DEBUG-NEXT:  [[RET:%.+]] = call i32 [[TMAIN:@.+tmain.+]](i8**
>> [[ARGV]])
>> -// CHECK-DEBUG-NEXT:  ret i32 [[RET]]
>> +// CHECK-DEBUG:       ret i32
>>  // CHECK-DEBUG-NEXT:  }
>>
>> -// CHECK:       define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias
>> %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4)
>> [[ARGC_ADDR:%[^)]+]])
>> +// CHECK:       define internal {{.*}}void [[OMP_OUTLINED]](i32* noalias
>> %.global_tid., i32* noalias %.bound_tid., i64 [[VLA_SIZE:%.+]], i32*
>> [[VLA_ADDR:%[^)]+]])
>>  // CHECK-SAME:       #[[FN_ATTRS:[0-9]+]]
>> -// CHECK:       store i32* [[ARGC_ADDR]], i32** [[ARGC_PTR_ADDR:%.+]],
>> -// CHECK:       [[ARGC_REF:%.+]] = load i32*, i32** [[ARGC_PTR_ADDR]]
>> -// CHECK-NEXT:  [[ARGC:%.+]] = load i32, i32* [[ARGC_REF]]
>> -// CHECK-NEXT:  invoke {{.*}}void [[FOO:@.+foo.+]](i32{{[ ]?[a-z]*}}
>> [[ARGC]])
>> +// CHECK:       store i32* [[VLA_ADDR]], i32** [[VLA_PTR_ADDR:%.+]],
>> +// CHECK:       [[VLA_REF:%.+]] = load i32*, i32** [[VLA_PTR_ADDR]]
>> +// CHECK:       [[VLA_ELEM_REF:%.+]] = getelementptr inbounds i32, i32*
>> [[VLA_REF]], i64 1
>> +// CHECK-NEXT:  [[VLA_ELEM:%.+]] = load i32, i32* [[VLA_ELEM_REF]]
>> +// CHECK-NEXT:  invoke {{.*}}void [[FOO:@.+foo.+]](i32{{[ ]?[a-z]*}}
>> [[VLA_ELEM]])
>>  // CHECK:       ret void
>>  // CHECK:       call {{.*}}void @{{.+terminate.*|abort}}(
>>  // CHECK-NEXT:  unreachable
>>  // CHECK-NEXT:  }
>> -// CHECK-DEBUG:       define internal void [[OMP_OUTLINED]](i32* noalias
>> %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4)
>> [[ARGC_ADDR:%[^)]+]])
>> +// CHECK-DEBUG:       define internal void [[OMP_OUTLINED]](i32* noalias
>> %.global_tid., i32* noalias %.bound_tid., i64 [[VLA_SIZE:%.+]], i32*
>> [[VLA_ADDR:%[^)]+]])
>>  // CHECK-DEBUG-SAME:  #[[FN_ATTRS:[0-9]+]]
>> -// CHECK-DEBUG:       store i32* [[ARGC_ADDR]], i32**
>> [[ARGC_PTR_ADDR:%.+]],
>> -// CHECK-DEBUG:  [[ARGC_REF:%.+]] = load i32*, i32** [[ARGC_PTR_ADDR]]
>> -// CHECK-DEBUG-NEXT:  [[ARGC:%.+]] = load i32, i32* [[ARGC_REF]]
>> -// CHECK-DEBUG-NEXT:  invoke void [[FOO:@.+foo.+]](i32 [[ARGC]])
>> +// CHECK-DEBUG:       store i32* [[VLA_ADDR]], i32**
>> [[VLA_PTR_ADDR:%.+]],
>> +// CHECK-DEBUG:       [[VLA_REF:%.+]] = load i32*, i32** [[VLA_PTR_ADDR]]
>> +// CHECK-DEBUG:       [[VLA_ELEM_REF:%.+]] = getelementptr inbounds i32,
>> i32* [[VLA_REF]], i64 1
>> +// CHECK-DEBUG-NEXT:  [[VLA_ELEM:%.+]] = load i32, i32* [[VLA_ELEM_REF]]
>> +// CHECK-DEBUG-NEXT:  invoke void [[FOO:@.+foo.+]](i32 [[VLA_ELEM]])
>>  // CHECK-DEBUG:       ret void
>>  // CHECK-DEBUG:       call void @{{.+terminate.*|abort}}(
>>  // CHECK-DEBUG-NEXT:  unreachable
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161107/0385c3c3/attachment.html>


More information about the cfe-commits mailing list