Author: Alexey Bataev
Date: 2020-03-30T17:07:08-04:00
New Revision: a4f74f377b7c42d38a230a19996e3a7fa5a328c7

URL: 
https://github.com/llvm/llvm-project/commit/a4f74f377b7c42d38a230a19996e3a7fa5a328c7
DIFF: 
https://github.com/llvm/llvm-project/commit/a4f74f377b7c42d38a230a19996e3a7fa5a328c7.diff

LOG: [OPENMP50]Do not imply lvalue as base expression in array shaping
expression.

We should not assume that the base expression in the array shaping
operation is an lvalue of some form, it may be an rvalue.

Added: 
    

Modified: 
    clang/lib/CodeGen/CGOpenMPRuntime.cpp
    clang/lib/Sema/SemaExpr.cpp
    clang/test/OpenMP/task_codegen.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp 
b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 4b913607c1db..ae98433acb48 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -5364,14 +5364,12 @@ std::pair<llvm::Value *, Address> 
CGOpenMPRuntime::emitDependClause(
         continue;
       const Expr *E = Dependencies[I].second;
       const auto *OASE = dyn_cast<OMPArrayShapingExpr>(E);
-      LValue Addr;
+      llvm::Value *Addr;
       if (OASE) {
-        const Expr *Base = OASE->getBase()->IgnoreParenImpCasts();
-        Addr =
-            CGF.EmitLoadOfPointerLValue(CGF.EmitLValue(Base).getAddress(CGF),
-                                        
Base->getType()->castAs<PointerType>());
+        const Expr *Base = OASE->getBase();
+        Addr = CGF.EmitScalarExpr(Base);
       } else {
-        Addr = CGF.EmitLValue(E);
+        Addr = CGF.EmitLValue(E).getPointer(CGF);
       }
       llvm::Value *Size;
       QualType Ty = E->getType();
@@ -5390,8 +5388,7 @@ std::pair<llvm::Value *, Address> 
CGOpenMPRuntime::emitDependClause(
             CGF.EmitOMPArraySectionExpr(ASE, /*IsLowerBound=*/false);
         llvm::Value *UpAddr = CGF.Builder.CreateConstGEP1_32(
             UpAddrLVal.getPointer(CGF), /*Idx0=*/1);
-        llvm::Value *LowIntPtr =
-            CGF.Builder.CreatePtrToInt(Addr.getPointer(CGF), CGM.SizeTy);
+        llvm::Value *LowIntPtr = CGF.Builder.CreatePtrToInt(Addr, CGM.SizeTy);
         llvm::Value *UpIntPtr = CGF.Builder.CreatePtrToInt(UpAddr, CGM.SizeTy);
         Size = CGF.Builder.CreateNUWSub(UpIntPtr, LowIntPtr);
       } else {
@@ -5410,9 +5407,8 @@ std::pair<llvm::Value *, Address> 
CGOpenMPRuntime::emitDependClause(
       // deps[i].base_addr = &<Dependencies[i].second>;
       LValue BaseAddrLVal = CGF.EmitLValueForField(
           Base, *std::next(KmpDependInfoRD->field_begin(), BaseAddr));
-      CGF.EmitStoreOfScalar(
-          CGF.Builder.CreatePtrToInt(Addr.getPointer(CGF), CGF.IntPtrTy),
-          BaseAddrLVal);
+      CGF.EmitStoreOfScalar(CGF.Builder.CreatePtrToInt(Addr, CGF.IntPtrTy),
+                            BaseAddrLVal);
       // deps[i].len = sizeof(<Dependencies[i].second>);
       LValue LenLVal = CGF.EmitLValueForField(
           Base, *std::next(KmpDependInfoRD->field_begin(), Len));

diff  --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 44f51f1a432d..1a18eab72527 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -4804,6 +4804,9 @@ ExprResult Sema::ActOnOMPArrayShapingExpr(Expr *Base, 
SourceLocation LParenLoc,
                                           ArrayRef<SourceRange> Brackets) {
   if (Base->getType()->isPlaceholderType()) {
     ExprResult Result = CheckPlaceholderExpr(Base);
+    if (Result.isInvalid())
+      return ExprError();
+    Result = DefaultLvalueConversion(Result.get());
     if (Result.isInvalid())
       return ExprError();
     Base = Result.get();

diff  --git a/clang/test/OpenMP/task_codegen.c 
b/clang/test/OpenMP/task_codegen.c
index 9376c375d5a8..9e4b3b59d6d5 100644
--- a/clang/test/OpenMP/task_codegen.c
+++ b/clang/test/OpenMP/task_codegen.c
@@ -56,7 +56,6 @@ int main() {
   // CHECK: store i64 4, i64* [[SIZE_ADDR]],
   // CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds 
%struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA0]], i{{.+}} 0, i{{.+}} 2
   // CHECK: store i8 1, i8* [[FLAGS_ADDR]],
-  // CHECK: [[B_ADDR:%.+]] = load i32*, i32** %{{.+}},
   // CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
   // CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64
   // CHECK: [[SZ1:%.+]] = mul nuw i64 3, [[A_CAST]]
@@ -65,7 +64,7 @@ int main() {
   // CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], [[A_CAST]]
   // CHECK: [[VLA1:%.+]] = getelementptr %struct.kmp_depend_info, 
%struct.kmp_depend_info* [[VLA]], i64 1
   // CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds 
%struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 0
-  // CHECK: [[B_ADDR_CAST:%.+]] = ptrtoint i32* [[B_ADDR]] to i64
+  // CHECK: [[B_ADDR_CAST:%.+]] = ptrtoint i32** %{{.+}} to i64
   // CHECK: store i64 [[B_ADDR_CAST]], i64* [[BASE_ADDR]],
   // CHECK: [[SIZE_ADDR:%.+]] = getelementptr inbounds 
%struct.kmp_depend_info, %struct.kmp_depend_info* [[VLA1]], i{{.+}} 0, i{{.+}} 1
   // CHECK: store i64 [[SZ]], i64* [[SIZE_ADDR]],
@@ -85,7 +84,7 @@ int main() {
   // CHECK: call i32 @__kmpc_omp_task_with_deps(%struct.ident_t* @{{.+}}, i32 
[[GTID]], i8* [[ALLOC]], i32 [[SIZE32]], i8* [[BC]], i32 0, i8* null)
   // CHECK: [[SV:%.+]] = load i8*, i8** [[SV_ADDR]],
   // CHECK: call void @llvm.stackrestore(i8* [[SV]])
-#pragma omp task depend(in: a, ([3][a][a])b) depend(depobj: d, x) detach(evt)
+#pragma omp task depend(in: a, ([3][a][a])&b) depend(depobj: d, x) detach(evt)
   {
 #pragma omp taskgroup
     {


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to