Skip to content

Commit dcda314

Browse files
authored
[flang][cuda] Fix atmoicxor lowering to accept arrays (#130331)
The first agrument can be an address of a scalare, an array element or even just the address of the first element of an array. Update lowering to not trigger elemental lowering.
1 parent 6cc8b0b commit dcda314

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

flang/include/flang/Optimizer/Builder/IntrinsicCall.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ struct IntrinsicLibrary {
195195
mlir::Value genAtomicMin(mlir::Type, llvm::ArrayRef<mlir::Value>);
196196
mlir::Value genAtomicOr(mlir::Type, llvm::ArrayRef<mlir::Value>);
197197
mlir::Value genAtomicSub(mlir::Type, llvm::ArrayRef<mlir::Value>);
198-
mlir::Value genAtomicXor(mlir::Type, llvm::ArrayRef<mlir::Value>);
198+
fir::ExtendedValue genAtomicXor(mlir::Type,
199+
llvm::ArrayRef<fir::ExtendedValue>);
199200
fir::ExtendedValue
200201
genCommandArgumentCount(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
201202
mlir::Value genAsind(mlir::Type, llvm::ArrayRef<mlir::Value>);

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2827,13 +2827,13 @@ mlir::Value IntrinsicLibrary::genAtomicMin(mlir::Type resultType,
28272827
}
28282828

28292829
// ATOMICXOR
2830-
mlir::Value IntrinsicLibrary::genAtomicXor(mlir::Type resultType,
2831-
llvm::ArrayRef<mlir::Value> args) {
2830+
fir::ExtendedValue
2831+
IntrinsicLibrary::genAtomicXor(mlir::Type resultType,
2832+
llvm::ArrayRef<fir::ExtendedValue> args) {
28322833
assert(args.size() == 2);
2833-
assert(mlir::isa<mlir::IntegerType>(args[1].getType()));
2834-
2835-
mlir::LLVM::AtomicBinOp binOp = mlir::LLVM::AtomicBinOp::_xor;
2836-
return genAtomBinOp(builder, loc, binOp, args[0], args[1]);
2834+
mlir::Value arg0 = fir::getBase(args[0]);
2835+
mlir::Value arg1 = fir::getBase(args[1]);
2836+
return genAtomBinOp(builder, loc, mlir::LLVM::AtomicBinOp::_xor, arg0, arg1);
28372837
}
28382838

28392839
// ASSOCIATED

flang/test/Lower/CUDA/cuda-device-proc.cuf

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,21 +150,28 @@ end subroutine
150150
! CHECK: fir.convert %{{.*}} : (f64) -> i64
151151
! CHECK: fir.call @llvm.nvvm.match.any.sync.i64p
152152

153-
attributes(device) subroutine testAtomic()
154-
integer :: a, istat, j
153+
attributes(device) subroutine testAtomic(aa, n)
154+
integer :: aa(*)
155+
integer, intent(in) :: n
156+
integer :: a, istat, j, i
155157
real :: r
156158
istat = atomicexch(a,0)
157159
istat = atomicexch(r, 0.0)
158160
istat = atomicxor(a, j)
159161
istat = atomiccas(a, i, 14)
162+
do i = 1, n
163+
istat = atomicxor(aa, i)
164+
end do
160165
end subroutine
161166

162-
! CHECK-LABEL: func.func @_QPtestatomic()
167+
! CHECK-LABEL: func.func @_QPtestatomic
163168
! CHECK: llvm.atomicrmw xchg %{{.*}}, %c0{{.*}} seq_cst : !llvm.ptr, i32
164169
! CHECK: llvm.atomicrmw xchg %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, f32
165170
! CHECK: llvm.atomicrmw _xor %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32
166171
! CHECK: %[[ADDR:.*]] = builtin.unrealized_conversion_cast %{{.*}}#1 : !fir.ref<i32> to !llvm.ptr
167172
! CHECK: llvm.cmpxchg %[[ADDR]], %{{.*}}, %c14{{.*}} acq_rel monotonic : !llvm.ptr, i32
173+
! CHECK: fir.do_loop
174+
! CHECK: llvm.atomicrmw _xor %{{.*}}, %{{.*}} seq_cst : !llvm.ptr, i32
168175

169176
attributes(device) subroutine testAtomic2()
170177
integer(8) :: a, i, istat

0 commit comments

Comments
 (0)