
Fixes #88935 Toggling reduction by-ref broke when multiple reduction clauses were used. Decisions made for the by-ref status for later clauses could then invalidate decisions for earlier clauses. For example, ``` reduction(+:scalar,scalar2) reduction(+:array) ``` The first clause would choose by value reduction and generate by-value reduction regions, but then after this the second clause would force by-ref to support the array argument. But by the time the second clause is processed, the first clause has already had the wrong kind of reduction regions generated. This is solved by toggling whether a variable should be reduced by reference per variable. In the above example, this allows only `array` to be reduced by ref.
37 lines
1.2 KiB
Plaintext
37 lines
1.2 KiB
Plaintext
// RUN: tco %s | FileCheck %s
|
|
|
|
// the fir.embox in the init region is turned into an alloca for the box. Test
|
|
// that CodeGen.cpp knows where to place an alloca when it is inside of an
|
|
// omp.declare_reduction
|
|
|
|
// regretably this has to be nonsense IR because we need the subsequent patches
|
|
// to process anything useful
|
|
|
|
omp.declare_reduction @test_reduction : !fir.ref<!fir.box<i32>> init {
|
|
^bb0(%arg0: !fir.ref<!fir.box<i32>>):
|
|
%0 = fir.alloca !fir.box<i32>
|
|
%1 = fir.alloca i32
|
|
%2 = fir.embox %1 : (!fir.ref<i32>) -> !fir.box<i32>
|
|
|
|
// use the embox for something so it isn't removed
|
|
fir.store %2 to %0 : !fir.ref<!fir.box<i32>>
|
|
|
|
omp.yield(%0 : !fir.ref<!fir.box<i32>>)
|
|
} combiner {
|
|
^bb0(%arg0: !fir.ref<!fir.box<i32>>, %arg1: !fir.ref<!fir.box<i32>>):
|
|
%0 = fir.undefined !fir.ref<!fir.box<i32>>
|
|
omp.yield(%0 : !fir.ref<!fir.box<i32>>)
|
|
}
|
|
|
|
func.func @_QQmain() attributes {fir.bindc_name = "reduce"} {
|
|
%4 = fir.alloca !fir.box<i32>
|
|
omp.parallel reduction(byref @test_reduction %4 -> %arg0 : !fir.ref<!fir.box<i32>>) {
|
|
omp.terminator
|
|
}
|
|
return
|
|
}
|
|
|
|
// basically we are testing that there isn't a crash
|
|
// CHECK-LABEL: define void @_QQmain
|
|
// CHECK-NEXT: alloca { ptr, i64, i32, i8, i8, i8, i8 }, i64 1, align 8
|