https://github.com/pedropiin updated https://github.com/llvm/llvm-project/pull/204999
>From 4993d3a2525313bfbba630e1a02dfeffc27fc0be Mon Sep 17 00:00:00 2001 From: pedropiin <[email protected]> Date: Sun, 21 Jun 2026 15:12:26 -0300 Subject: [PATCH 1/2] [CIR][OpenMP] Implement lowering for the 'if' clause for 'parallel' directive --- clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp | 23 ++++++++++++++++++++ clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h | 2 ++ clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp | 5 +++-- clang/test/CIR/CodeGenOpenMP/parallel.c | 22 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp index 16ac4440660b5..8155e4697e32d 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp @@ -93,6 +93,29 @@ bool OpenMPClauseEmitter::emitProcBind( return false; } +bool OpenMPClauseEmitter::emitIf(mlir::omp::IfClauseOps &result) const { + for (const OMPClause *clause : clauses) { + const auto *ic = dyn_cast<OMPIfClause>(clause); + if (!ic) + continue; + + Expr *ifCondition = ic->getCondition(); + mlir::Value ifBoolValue = cgf.evaluateExprAsBool(ifCondition); // !cir.bool + + mlir::Type uIntType = builder.getUIntNTy(1); + mlir::Value ifUIntValue = + builder.createBoolToInt(ifBoolValue, uIntType); // u1 + + mlir::Type intType = builder.getI1Type(); + mlir::Value ifExpr = + builder.createBuiltinIntCast(ifUIntValue, intType); // i1 + + result.ifExpr = ifExpr; + return true; + } + return false; +} + bool OpenMPClauseEmitter::emitMap( mlir::omp::MapClauseOps &result, llvm::SmallVectorImpl<const VarDecl *> *mapSyms) const { diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h index 54c7366b1d769..ee048296f1946 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h +++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h @@ -42,6 +42,8 @@ class OpenMPClauseEmitter { bool emitProcBind(mlir::omp::ProcBindClauseOps &result) const; + bool emitIf(mlir::omp::IfClauseOps &result) const; + /// Emit map clauses. The optional \p mapSyms parameter collects the /// VarDecls corresponding to each map operand. bool emitMap(mlir::omp::MapClauseOps &result, diff --git a/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp b/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp index a42735391629f..c60b1bd12e1f8 100644 --- a/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp @@ -39,10 +39,11 @@ CIRGenFunction::emitOMPParallelDirective(const OMPParallelDirective &s) { mlir::omp::ParallelOperands clauseOps; OpenMPClauseEmitter ce(*this, getCIRGenModule(), builder, begin, s.clauses()); ce.emitProcBind(clauseOps); - ce.emitNYI</*supported=*/OMPProcBindClause>( + ce.emitIf(clauseOps); + ce.emitNYI</*supported=*/OMPProcBindClause, OMPIfClause>( /*nyi=*/OpenMPNYIClauseList< OMPAllocateClause, OMPCopyinClause, OMPDefaultClause, - OMPFirstprivateClause, OMPIfClause, OMPNumThreadsClause, + OMPFirstprivateClause, OMPNumThreadsClause, OMPPrivateClause, OMPReductionClause, OMPSharedClause>{}, llvm::omp::Directive::OMPD_parallel); diff --git a/clang/test/CIR/CodeGenOpenMP/parallel.c b/clang/test/CIR/CodeGenOpenMP/parallel.c index 4fb7997ab6635..11804de1010a3 100644 --- a/clang/test/CIR/CodeGenOpenMP/parallel.c +++ b/clang/test/CIR/CodeGenOpenMP/parallel.c @@ -84,3 +84,25 @@ void proc_bind_parallel() { // CHECK-NEXT: omp.terminator // CHECK-NEXT: } } + +void if_parallel() { + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (1) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +int validCondition = 10; + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (validCondition) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +void *nullPtr = ((void *)0); + // CHECK: omp.parallel if(%{{.*}}) { +#pragma omp parallel if (nullPtr) + {} + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } +} >From 9cd8fbad7e31d701aadb978fb5b8b6f64e176078 Mon Sep 17 00:00:00 2001 From: pedropiin <[email protected]> Date: Sun, 21 Jun 2026 15:12:26 -0300 Subject: [PATCH 2/2] [CIR][OpenMP] Implement lowering for the 'if' clause for 'parallel' directive --- clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp | 7 ++- clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h | 3 +- clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp | 12 ++-- .../CIR/CodeGenOpenMP/not-yet-implemented.c | 5 -- clang/test/CIR/CodeGenOpenMP/parallel.c | 62 +++++++++++++++++-- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp index 8155e4697e32d..2f6395486939f 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.cpp @@ -93,12 +93,17 @@ bool OpenMPClauseEmitter::emitProcBind( return false; } -bool OpenMPClauseEmitter::emitIf(mlir::omp::IfClauseOps &result) const { +bool OpenMPClauseEmitter::emitIf(mlir::omp::IfClauseOps &result, + llvm::omp::Directive directiveName) const { for (const OMPClause *clause : clauses) { const auto *ic = dyn_cast<OMPIfClause>(clause); if (!ic) continue; + if (!(ic->getNameModifier() == llvm::omp::Directive::OMPD_unknown) && + ic->getNameModifier() != directiveName) + continue; + Expr *ifCondition = ic->getCondition(); mlir::Value ifBoolValue = cgf.evaluateExprAsBool(ifCondition); // !cir.bool diff --git a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h index ee048296f1946..aa6c6653bc540 100644 --- a/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h +++ b/clang/lib/CIR/CodeGen/CIRGenOpenMPClause.h @@ -42,7 +42,8 @@ class OpenMPClauseEmitter { bool emitProcBind(mlir::omp::ProcBindClauseOps &result) const; - bool emitIf(mlir::omp::IfClauseOps &result) const; + bool emitIf(mlir::omp::IfClauseOps &result, + llvm::omp::Directive directiveName) const; /// Emit map clauses. The optional \p mapSyms parameter collects the /// VarDecls corresponding to each map operand. diff --git a/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp b/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp index c60b1bd12e1f8..3e9355e619bc1 100644 --- a/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenStmtOpenMP.cpp @@ -38,13 +38,13 @@ CIRGenFunction::emitOMPParallelDirective(const OMPParallelDirective &s) { mlir::omp::ParallelOperands clauseOps; OpenMPClauseEmitter ce(*this, getCIRGenModule(), builder, begin, s.clauses()); + ce.emitIf(clauseOps, llvm::omp::Directive::OMPD_parallel); ce.emitProcBind(clauseOps); - ce.emitIf(clauseOps); - ce.emitNYI</*supported=*/OMPProcBindClause, OMPIfClause>( - /*nyi=*/OpenMPNYIClauseList< - OMPAllocateClause, OMPCopyinClause, OMPDefaultClause, - OMPFirstprivateClause, OMPNumThreadsClause, - OMPPrivateClause, OMPReductionClause, OMPSharedClause>{}, + ce.emitNYI</*supported=*/OMPIfClause, OMPProcBindClause>( + /*nyi=*/OpenMPNYIClauseList<OMPAllocateClause, OMPCopyinClause, + OMPDefaultClause, OMPFirstprivateClause, + OMPNumThreadsClause, OMPPrivateClause, + OMPReductionClause, OMPSharedClause>{}, llvm::omp::Directive::OMPD_parallel); auto parallelOp = mlir::omp::ParallelOp::create(builder, begin, clauseOps); diff --git a/clang/test/CIR/CodeGenOpenMP/not-yet-implemented.c b/clang/test/CIR/CodeGenOpenMP/not-yet-implemented.c index ed4240727ff64..93a17494ad605 100644 --- a/clang/test/CIR/CodeGenOpenMP/not-yet-implemented.c +++ b/clang/test/CIR/CodeGenOpenMP/not-yet-implemented.c @@ -8,9 +8,4 @@ void do_things() { // expected-error@+1{{ClangIR code gen Not Yet Implemented: OpenMP OMPSingleDirective}} #pragma omp single {} - - int i; - // expected-error@+1{{ClangIR code gen Not Yet Implemented: OpenMP PARALLEL 'if' clause}} -#pragma omp parallel if(i) - {} } diff --git a/clang/test/CIR/CodeGenOpenMP/parallel.c b/clang/test/CIR/CodeGenOpenMP/parallel.c index 11804de1010a3..68b78ed1ce7ee 100644 --- a/clang/test/CIR/CodeGenOpenMP/parallel.c +++ b/clang/test/CIR/CodeGenOpenMP/parallel.c @@ -86,23 +86,73 @@ void proc_bind_parallel() { } void if_parallel() { - // CHECK: omp.parallel if(%{{.*}}) { -#pragma omp parallel if (1) + // CHECK: cir.func{{.*}}@if_parallel + + int validCondition = 10; + int invalidCondition = 0; + void *nullPtr = ((void *)0); + + // CHECK-NEXT: %[[VALID_CONDITION_ADDR:.*]] = cir.alloca "validCondition" + // CHECK-NEXT: %[[INVALID_CONDITION_ADDR:.*]] = cir.alloca "invalidCondition" + // CHECK-NEXT: %[[NULL_ADDR:.*]] = cir.alloca "nullPtr" + + #pragma omp parallel if (1) {} + // CHECK: %[[ONE_CONST:.*]] = cir.const #cir.int<1> + // CHECK-NEXT: %[[ONE_BOOL:.*]] = cir.cast int_to_bool %[[ONE_CONST]] + // CHECK-NEXT: %[[ONE_U1:.*]] = cir.cast bool_to_int %[[ONE_BOOL]] + // CHECK-NEXT: %[[ONE_I1:.*]] = cir.builtin_int_cast %[[ONE_U1]] + // CHECK-NEXT: omp.parallel if(%[[ONE_I1]]) { // CHECK-NEXT: omp.terminator // CHECK-NEXT: } -int validCondition = 10; - // CHECK: omp.parallel if(%{{.*}}) { #pragma omp parallel if (validCondition) {} + // CHECK-NEXT: %[[VALID_CONDITION_PTR:.*]] = cir.load align(4) %[[VALID_CONDITION_ADDR]] + // CHECK-NEXT: %[[VALID_CONDITION_BOOL:.*]] = cir.cast int_to_bool %[[VALID_CONDITION_PTR]] + // CHECK-NEXT: %[[VALID_CONDITION_U1:.*]] = cir.cast bool_to_int %[[VALID_CONDITION_BOOL]] + // CHECK-NEXT: %[[VALID_CONDITION_I1:.*]] = cir.builtin_int_cast %[[VALID_CONDITION_U1]] + // CHECK-NEXT: omp.parallel if(%[[VALID_CONDITION_I1]]) { // CHECK-NEXT: omp.terminator // CHECK-NEXT: } -void *nullPtr = ((void *)0); - // CHECK: omp.parallel if(%{{.*}}) { #pragma omp parallel if (nullPtr) {} + // CHECK-NEXT: %[[NULL_PTR:.*]] = cir.load align(8) %[[NULL_ADDR]] + // CHECK-NEXT: %[[NULL_BOOL:.*]] = cir.cast ptr_to_bool %[[NULL_PTR]] + // CHECK-NEXT: %[[NULL_U1:.*]] = cir.cast bool_to_int %[[NULL_BOOL]] + // CHECK-NEXT: %[[NULL_I1:.*]] = cir.builtin_int_cast %[[NULL_U1]] + // CHECK-NEXT: omp.parallel if(%[[NULL_I1]]) { + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +#pragma omp parallel if (invalidCondition) + {} + // CHECK-NEXT: %[[INVALID_CONDITION_PTR:.*]] = cir.load align(4) %[[INVALID_CONDITION_ADDR]] + // CHECK-NEXT: %[[INVALID_CONDITION_BOOL:.*]] = cir.cast int_to_bool %[[INVALID_CONDITION_PTR]] + // CHECK-NEXT: %[[INVALID_CONDITION_U1:.*]] = cir.cast bool_to_int %[[INVALID_CONDITION_BOOL]] + // CHECK-NEXT: %[[INVALID_CONDITION_I1:.*]] = cir.builtin_int_cast %[[INVALID_CONDITION_U1]] + // CHECK-NEXT: omp.parallel if(%[[INVALID_CONDITION_I1]]) { + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +#pragma omp parallel if (parallel: validCondition) + {} + // CHECK-NEXT: %[[VALID_CONDITION_DIRECTIVE_PTR:.*]] = cir.load align(4) %[[VALID_CONDITION_ADDR]] + // CHECK-NEXT: %[[VALID_CONDITION_DIRECTIVE_BOOL:.*]] = cir.cast int_to_bool %[[VALID_CONDITION_DIRECTIVE_PTR]] + // CHECK-NEXT: %[[VALID_CONDITION_DIRECTIVE_U1:.*]] = cir.cast bool_to_int %[[VALID_CONDITION_DIRECTIVE_BOOL]] + // CHECK-NEXT: %[[VALID_CONDITION_DIRECTIVE_I1:.*]] = cir.builtin_int_cast %[[VALID_CONDITION_DIRECTIVE_U1]] + // CHECK-NEXT: omp.parallel if(%[[VALID_CONDITION_DIRECTIVE_I1]]) { + // CHECK-NEXT: omp.terminator + // CHECK-NEXT: } + +#pragma omp parallel if (parallel: invalidCondition) + {} + // CHECK-NEXT: %[[INVALID_CONDITION_DIRECTIVE_PTR:.*]] = cir.load align(4) %[[INVALID_CONDITION_ADDR]] + // CHECK-NEXT: %[[INVALID_CONDITION_DIRECTIVE_BOOL:.*]] = cir.cast int_to_bool %[[INVALID_CONDITION_DIRECTIVE_PTR]] + // CHECK-NEXT: %[[INVALID_CONDITION_DIRECTIVE_U1:.*]] = cir.cast bool_to_int %[[INVALID_CONDITION_DIRECTIVE_BOOL]] + // CHECK-NEXT: %[[INVALID_CONDITION_DIRECTIVE_I1:.*]] = cir.builtin_int_cast %[[INVALID_CONDITION_DIRECTIVE_U1]] + // CHECK-NEXT: omp.parallel if(%[[INVALID_CONDITION_DIRECTIVE_I1]]) { // CHECK-NEXT: omp.terminator // CHECK-NEXT: } } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
