diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -1129,22 +1129,26 @@ bool isRegionArgUsed{false}; llvm::AtomicRMWInst::BinOp binop; - bool isXBinopExpr{false}; + bool isXBinopExpr{false}, isUpdateOpPresent{false}; mlir::Value mlirExpr; - for (Operation &innerUpdateOp : innerOpList) { - // Operation &innerUpdateOp = innerOpList.front(); - if (llvm::is_contained(innerUpdateOp.getOperands(), - opInst.getRegion().getArgument(0))) { + for (Operation &innerOp : innerOpList) { + if (innerOp.getNumOperands() == 2) { + isUpdateOpPresent = true; + binop = convertBinOpToAtomic(innerOp); + isUpdateOpPresent = true; + if (!llvm::is_contained(innerOp.getOperands(), + opInst.getRegion().getArgument(0))) + continue; isRegionArgUsed = true; - binop = convertBinOpToAtomic(innerUpdateOp); - isXBinopExpr = - innerUpdateOp.getNumOperands() > 0 && - innerUpdateOp.getOperand(0) == opInst.getRegion().getArgument(0); - mlirExpr = (isXBinopExpr ? innerUpdateOp.getOperand(1) - : innerUpdateOp.getOperand(0)); + isXBinopExpr = innerOp.getNumOperands() > 0 && + innerOp.getOperand(0) == opInst.getRegion().getArgument(0); + mlirExpr = (isXBinopExpr ? innerOp.getOperand(1) : innerOp.getOperand(0)); break; } } + if (!isUpdateOpPresent) + return opInst.emitError("no atomic update operation found" + " inside atomic.update region"); if (!isRegionArgUsed) return opInst.emitError("the update operation inside the region " "must have the region argument as an operand"); @@ -1211,21 +1215,29 @@ isPostfixUpdate = atomicCaptureOp.getSecondOp() == atomicCaptureOp.getAtomicUpdateOp().getOperation(); auto &innerOpList = atomicUpdateOp.getRegion().front().getOperations(); - bool isRegionArgUsed{false}; - // bool isXBinopExpr{false}; - for (Operation &innerUpdateOp : innerOpList) { - if (llvm::is_contained(innerUpdateOp.getOperands(), - atomicUpdateOp.getRegion().getArgument(0))) { + bool isRegionArgUsed{false}, isUpdateOpPresent{false}; + for (Operation &innerOp : innerOpList) { + if (innerOp.getNumOperands() == 2) { + isUpdateOpPresent = true; + binop = convertBinOpToAtomic(innerOp); + if (!llvm::is_contained(innerOp.getOperands(), + atomicUpdateOp.getRegion().getArgument(0))) + continue; isRegionArgUsed = true; - binop = convertBinOpToAtomic(innerUpdateOp); - isXBinopExpr = innerUpdateOp.getNumOperands() > 0 && - innerUpdateOp.getOperand(0) == - atomicUpdateOp.getRegion().getArgument(0); - mlirExpr = (isXBinopExpr ? innerUpdateOp.getOperand(1) - : innerUpdateOp.getOperand(0)); + isXBinopExpr = + innerOp.getNumOperands() > 0 && + innerOp.getOperand(0) == atomicUpdateOp.getRegion().getArgument(0); + mlirExpr = + (isXBinopExpr ? innerOp.getOperand(1) : innerOp.getOperand(0)); + break; } } + + if (!isUpdateOpPresent) + return atomicUpdateOp.emitError("no atomic update operation found" + " inside atomic.update region"); + if (!isRegionArgUsed) return atomicUpdateOp.emitError( "the update operation inside the region "