Re: [PATCH] D12262: [OpenMP] Capture global variables in target regions.
sfantao closed this revision. sfantao added a comment. Committed in r249154. Thanks! Samuel http://reviews.llvm.org/D12262 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12262: [OpenMP] Capture global variables in target regions.
sfantao updated the summary for this revision. sfantao updated this revision to Diff 34870. sfantao added a comment. Rebase with the last changes in http://reviews.llvm.org/D12871. http://reviews.llvm.org/D12262 Files: include/clang/Basic/OpenMPKinds.h include/clang/Sema/Sema.h lib/Basic/OpenMPKinds.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaOpenMP.cpp test/OpenMP/target_codegen_global_capture.cpp Index: test/OpenMP/target_codegen_global_capture.cpp === --- /dev/null +++ test/OpenMP/target_codegen_global_capture.cpp @@ -0,0 +1,173 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// expected-no-diagnostics +#ifndef HEADER +#define HEADER + + +// CHECK-DAG: [[GA:@.+]] = global double 1.00e+00 +// CHECK-DAG: [[GB:@.+]] = global double 2.00e+00 +// CHECK-DAG: [[GC:@.+]] = global double 3.00e+00 +// CHECK-DAG: [[GD:@.+]] = global double 4.00e+00 +// CHECK-DAG: [[FA:@.+]] = internal global float 5.00e+00 +// CHECK-DAG: [[FB:@.+]] = internal global float 6.00e+00 +// CHECK-DAG: [[FC:@.+]] = internal global float 7.00e+00 +// CHECK-DAG: [[FD:@.+]] = internal global float 8.00e+00 +// CHECK-DAG: [[BA:@.+]] = internal global float 9.00e+00 +// CHECK-DAG: [[BB:@.+]] = internal global float 1.00e+01 +// CHECK-DAG: [[BC:@.+]] = internal global float 1.10e+01 +// CHECK-DAG: [[BD:@.+]] = internal global float 1.20e+01 +double Ga = 1.0; +double Gb = 2.0; +double Gc = 3.0; +double Gd = 4.0; + +// CHECK: define {{.*}} @{{.*}}foo{{.*}}( +// CHECK-SAME: i16 {{[^,]*}}[[A:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[B:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[C:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[D:%[^,]+]]) +// CHECK: [[LA:%.+]] = alloca i16 +// CHECK: [[LB:%.+]] = alloca i16 +// CHECK: [[LC:%.+]] = alloca i16 +// CHECK: [[LD:%.+]] = alloca i16 +int foo(short a, short b, short c, short d){ + static float Sa = 5.0; + static float Sb = 6.0; + static float Sc = 7.0; + static float Sd = 8.0; + + // CHECK-DAG: [[REFB:%.+]] = bitcast i16* [[LB]] to i8* + // CHECK-DAG: store i8* [[REFB]], i8** [[GEPB:%.+]], align + // CHECK-DAG: [[REFC:%.+]] = bitcast i16* [[LC]] to i8* + // CHECK-DAG: store i8* [[REFC]], i8** [[GEPC:%.+]], align + // CHECK-DAG: [[REFD:%.+]] = bitcast i16* [[LD]] to i8* + // CHECK-DAG: store i8* [[REFD]], i8** [[GEPD:%.+]], align + // CHECK-DAG: store i8* bitcast (double* [[GB]] to i8*), i8** [[GEPGB:%.+]], align + // CHECK-DAG: store i8* bitcast (double* [[GC]] to i8*), i8** [[GEPGC:%.+]], align + // CHECK-DAG: store i8* bitcast (double* [[GD]] to i8*), i8** [[GEPGD:%.+]], align + // CHECK-DAG: store i8* bitcast (float* [[FB]] to i8*), i8** [[GEPFB:%.+]], align + // CHECK-DAG: store i8* bitcast (float* [[FC]] to i8*), i8** [[GEPFC:%.+]], align + // CHECK-DAG: store i8* bitcast (float* [[FD]] to i8*), i8** [[GEPFD:%.+]], align + // CHECK-DAG: [[GEPB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK: call i32 @__tgt_target + // CHECK: call void [[OFFLOADF:@.+]]( + // Capture b, Gb, Sb, Gc, c, Sc, d, Gd, Sd + #pragma omp target if(Ga>0.0 && a>0 && Sa>0.0) + { +b += 1; +Gb += 1.0; +Sb += 1.0; + +// CHECK: define internal void [[OFFLOADF]]({{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}, {{.+}}* {{.*}}%{{.+}}) +// The parallel region only uses 3 captures. +
Re: [PATCH] D12262: [OpenMP] Capture global variables in target regions.
ABataev added a comment. LGTM http://reviews.llvm.org/D12262 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12262: [OpenMP] Capture global variables in target regions.
sfantao added inline comments. Comment at: lib/Sema/SemaOpenMP.cpp:702 @@ +701,3 @@ + return true; +} + } Alexey, after rebasing this patch with the latest changes, I started having a regression related with how `DSAStack->hasDirective` works. In my understanding it requires that a valid scope exists in the stack, or alternatively that 2 or more entries exist in the stack. In some cases `DSAStack->hasDirective` was being called with only one entry causing the iterators in there not to work properly. The fix for that was adding `DSAStack->getCurScope()`. It seems to be a harmless change, but still wanted to make sure you agree with that. Thanks! http://reviews.llvm.org/D12262 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12262: [OpenMP] Capture global variables in target regions.
sfantao updated this revision to Diff 33712. sfantao added a comment. Rebase on top of the last changes in http://reviews.llvm.org/D11361. http://reviews.llvm.org/D12262 Files: include/clang/Basic/OpenMPKinds.h include/clang/Sema/Sema.h lib/Basic/OpenMPKinds.cpp lib/Sema/SemaExpr.cpp lib/Sema/SemaOpenMP.cpp test/OpenMP/target_codegen_global_capture.cpp Index: test/OpenMP/target_codegen_global_capture.cpp === --- /dev/null +++ test/OpenMP/target_codegen_global_capture.cpp @@ -0,0 +1,186 @@ +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s +// expected-no-diagnostics +#ifndef HEADER +#define HEADER + + +// CHECK-DAG: [[GA:@.+]] = global double 1.00e+00 +// CHECK-DAG: [[GB:@.+]] = global double 2.00e+00 +// CHECK-DAG: [[GC:@.+]] = global double 3.00e+00 +// CHECK-DAG: [[GD:@.+]] = global double 4.00e+00 +// CHECK-DAG: [[FA:@.+]] = internal global float 5.00e+00 +// CHECK-DAG: [[FB:@.+]] = internal global float 6.00e+00 +// CHECK-DAG: [[FC:@.+]] = internal global float 7.00e+00 +// CHECK-DAG: [[FD:@.+]] = internal global float 8.00e+00 +// CHECK-DAG: [[BA:@.+]] = internal global float 9.00e+00 +// CHECK-DAG: [[BB:@.+]] = internal global float 1.00e+01 +// CHECK-DAG: [[BC:@.+]] = internal global float 1.10e+01 +// CHECK-DAG: [[BD:@.+]] = internal global float 1.20e+01 +double Ga = 1.0; +double Gb = 2.0; +double Gc = 3.0; +double Gd = 4.0; + +// CHECK: define {{.*}} @{{.*}}foo{{.*}}( +// CHECK-SAME: i16 {{[^,]*}}[[A:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[B:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[C:%[^,]+]], +// CHECK-SAME: i16 {{[^,]*}}[[D:%[^,]+]]) +// CHECK: [[LA:%.+]] = alloca i16 +// CHECK: [[LB:%.+]] = alloca i16 +// CHECK: [[LC:%.+]] = alloca i16 +// CHECK: [[LD:%.+]] = alloca i16 +int foo(short a, short b, short c, short d){ + static float Sa = 5.0; + static float Sb = 6.0; + static float Sc = 7.0; + static float Sd = 8.0; + + // CHECK-DAG: [[REFB:%.+]] = bitcast i16* [[LB]] to i8* + // CHECK-DAG: store i8* [[REFB]], i8** [[GEPB:%.+]] + // CHECK-DAG: [[REFC:%.+]] = bitcast i16* [[LC]] to i8* + // CHECK-DAG: store i8* [[REFC]], i8** [[GEPC:%.+]] + // CHECK-DAG: [[REFD:%.+]] = bitcast i16* [[LD]] to i8* + // CHECK-DAG: store i8* [[REFD]], i8** [[GEPD:%.+]] + // CHECK-DAG: store i8* bitcast (double* [[GB]] to i8*), i8** [[GEPGB:%.+]] + // CHECK-DAG: store i8* bitcast (double* [[GC]] to i8*), i8** [[GEPGC:%.+]] + // CHECK-DAG: store i8* bitcast (double* [[GD]] to i8*), i8** [[GEPGD:%.+]] + // CHECK-DAG: store i8* bitcast (float* [[FB]] to i8*), i8** [[GEPFB:%.+]] + // CHECK-DAG: store i8* bitcast (float* [[FC]] to i8*), i8** [[GEPFC:%.+]] + // CHECK-DAG: store i8* bitcast (float* [[FD]] to i8*), i8** [[GEPFD:%.+]] + // CHECK-DAG: [[GEPB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPGD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFB]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFC]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK-DAG: [[GEPFD]] = getelementptr inbounds [9 x i8*], [9 x i8*]* %{{.+}}, i32 0, i32 {{.+}} + // CHECK: call i32 @__tgt_target + // CHECK: call void [[OFFLOADF:@.+]]( + // Capture b, Gb, Sb, Gc, c, Sc, d, Gd, Sd + #pragma omp target if(Ga>0.0 && a>0 && Sa>0.0) + { +b += 1; +Gb += 1.0; +Sb += 1.0; + + +// CHECK: define internal void [[PARF:@.+]](i32* %{{.*}}, i32* %{{.*}}, +// CHECK: define internal void [[OFFLOADF]]( + +// CHECK: alloca [[CCAPTY:%.+]], +// CHECK: [[CAP:%.+]] = alloca [[CAPTY:%.+]], +// CHECK: getelementptr inbounds [[CAPTY]], [[CAPTY]]* [[CAP]], i32 0, i32 +// CHECK: getelementptr inbounds [[CAPTY]], [[CAPTY]]* [[CAP]], i32 0, i32 +// CHECK: