brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.5 KiB · fd59d39 Raw
227 lines · plain
1! RUN: %flang_fc1 -fopenmp -emit-llvm %s -o - | FileCheck %s2 3! Combinational testing of control flow graph and builder insertion points4! in mlir-to-llvm conversion:5!   - mixing multiple delayed privatizations and multiple reductions6!   - multiple blocks in the private alloc region7!   - private alloc region has to read from the mold variable8!   - firstprivate9!   - multiple blocks in the private copy region10!   - multiple blocks in the reduction init region11!   - reduction init region has to read from the mold variable12!   - re-used omp.private ops13!   - re-used omp.reduction.declare ops14!   - unstructured code inside of the parallel region15!   - needs private dealloc region, and this has multiple blocks16!   - needs reduction cleanup region, and this has multiple blocks17 18! This maybe belongs in the mlir tests, but what we are doing here is complex19! enough that I find the kind of minimised mlir code preferred by mlir reviewers20! hard to read without some fortran here for reference. Nothing like this would21! be generated by other upstream users of the MLIR OpenMP dialect.22 23subroutine worst_case(a, b, c, d)24  real, allocatable :: a(:), b(:), c(:), d(:)25  integer i26 27  !$omp parallel firstprivate(a,b) reduction(+:c,d)28  if (sum(a) == 1) stop 129  !$omp end parallel30end subroutine31 32! CHECK-LABEL: define internal void @worst_case_..omp_par33! CHECK-NEXT:  omp.par.entry:34!                [reduction alloc regions inlined here]35! CHECK:         br label %omp.region.after_alloca36 37! CHECK:       omp.region.after_alloca:38! CHECK-NEXT:    br label %omp.par.region39 40! CHECK:       omp.par.region:41! CHECK-NEXT:    br label %omp.private.init42 43! CHECK:       omp.private.init:44! CHECK-NEXT:  br label %omp.private.init245 46! CHECK:       omp.private.init2:47!                [begin private alloc for first var]48!                [read the length from the mold argument]49!                [if it is non-zero...]50! CHECK:         br i1 %{{.*}}, label %omp.private.init3, label %omp.private.init451 52! CHECK:       omp.private.init4:                               ; preds = %omp.private.init253!                [finish private alloc for second var with zero extent]54! CHECK:         br label %omp.private.init555 56! CHECK:       omp.private.init5:                               ; preds = %omp.private.init3, %omp.private.init457! CHECK-NEXT:    br label %omp.region.cont58 59! CHECK:       omp.region.cont:                                  ; preds = %omp.private.init560! CHECK-NEXT:    %{{.*}} = phi ptr61! CHECK-NEXT:    br label %omp.private.init762 63! CHECK:       omp.private.init7:64!                [begin private alloc for first var]65!                [read the length from the mold argument]66!                [if it is non-zero...]67! CHECK:         br i1 {{.*}}, label %omp.private.init8, label %omp.private.init968 69! CHECK:       omp.private.init9:                               ; preds = %omp.private.init770!                [finish private alloc for first var with zero extent]71! CHECK:         br label %omp.private.init1072 73! CHECK:       omp.private.init10:                               ; preds = %omp.private.init8, %omp.private.init974! CHECK-NEXT:    br label %omp.region.cont675 76! CHECK:       omp.region.cont6:                                 ; preds = %omp.private.init1077! CHECK-NEXT:    %{{.*}} = phi ptr78! CHECK-NEXT:    br label %omp.private.copy79 80! CHECK:       omp.private.copy:81! CHECK-NEXT:    br label %omp.private.copy1282 83! CHECK:       omp.private.copy12:                               ; preds = %omp.private.copy84!                [begin firstprivate copy for first var]85!                [read the length, is it non-zero?]86! CHECK:         br i1 %{{.*}}, label %omp.private.copy13, label %omp.private.copy1487 88! CHECK:       omp.private.copy14:                               ; preds = %omp.private.copy13, %omp.private.copy1289! CHECK-NEXT:    br label %omp.region.cont1190 91! CHECK:       omp.region.cont11:                                 ; preds = %omp.private.copy1492! CHECK-NEXT:    %{{.*}} = phi ptr93! CHECK-NEXT:    br label %omp.private.copy1694 95! CHECK:       omp.private.copy16:                               ; preds = %omp.region.cont1196!                [begin firstprivate copy for second var]97!                [read the length, is it non-zero?]98! CHECK:         br i1 %{{.*}}, label %omp.private.copy17, label %omp.private.copy1899 100! CHECK:       omp.private.copy18:                               ; preds = %omp.private.copy17, %omp.private.copy16101! CHECK-NEXT:    br label %omp.region.cont15102 103! CHECK:       omp.region.cont15:                                ; preds = %omp.private.copy18104! CHECK-NEXT:    %{{.*}} = phi ptr105! CHECK-NEXT:    br label %omp.reduction.init106 107! CHECK:       omp.reduction.init:                               ; preds = %omp.region.cont15108!                [deffered stores for results of reduction alloc regions]109! CHECK:         br label %[[VAL_96:.*]]110 111! CHECK:       omp.reduction.neutral:                            ; preds = %omp.reduction.init112!                [start of reduction initialization region]113!                [null check:]114! CHECK:         br i1 %{{.*}}, label %omp.reduction.neutral20, label %omp.reduction.neutral21115 116! CHECK:       omp.reduction.neutral21:                          ; preds = %omp.reduction.neutral117!                [malloc and assign the default value to the reduction variable]118! CHECK:         br label %omp.reduction.neutral22119 120! CHECK:       omp.reduction.neutral22:                          ; preds = %omp.reduction.neutral20, %omp.reduction.neutral21121! CHECK-NEXT:    br label %omp.region.cont19122 123! CHECK:       omp.region.cont19:                                ; preds = %omp.reduction.neutral22124! CHECK-NEXT:    %{{.*}} = phi ptr125! CHECK-NEXT:    br label %omp.reduction.neutral24126 127! CHECK:       omp.reduction.neutral24:                          ; preds = %omp.region.cont19128!                [start of reduction initialization region]129!                [null check:]130! CHECK:         br i1 %{{.*}}, label %omp.reduction.neutral25, label %omp.reduction.neutral26131 132! CHECK:       omp.reduction.neutral26:                          ; preds = %omp.reduction.neutral24133!                [malloc and assign the default value to the reduction variable]134! CHECK:         br label %omp.reduction.neutral27135 136! CHECK:       omp.reduction.neutral27:                          ; preds = %omp.reduction.neutral25, %omp.reduction.neutral26137! CHECK-NEXT:    br label %omp.region.cont23138 139! CHECK:       omp.region.cont23:                                ; preds = %omp.reduction.neutral27140! CHECK-NEXT:    %{{.*}} = phi ptr141! CHECK-NEXT:    br label %omp.par.region29142 143! CHECK:       omp.par.region29:                                 ; preds = %omp.region.cont23144!                [call SUM runtime function]145!                [if (sum(a) == 1)]146! CHECK:         br i1 %{{.*}}, label %omp.par.region30, label %omp.par.region31147 148! CHECK:       omp.par.region31:                                 ; preds = %omp.par.region29149! CHECK-NEXT:    br label %omp.region.cont28150 151! CHECK:       omp.region.cont28:                                ; preds = %omp.par.region30, %omp.par.region31152!                [omp parallel region done, call into the runtime to complete reduction]153! CHECK:         %[[VAL_233:.*]] = call i32 @__kmpc_reduce(154! CHECK:         switch i32 %[[VAL_233]], label %reduce.finalize [155! CHECK-NEXT:      i32 1, label %reduce.switch.nonatomic156! CHECK-NEXT:      i32 2, label %reduce.switch.atomic157! CHECK-NEXT:    ]158 159! CHECK:       reduce.switch.atomic:                             ; preds = %omp.region.cont28160! CHECK-NEXT:    unreachable161 162! CHECK:       reduce.switch.nonatomic:                          ; preds = %omp.region.cont28163! CHECK-NEXT:    %[[red_private_value_0:.*]] = load ptr, ptr %{{.*}}, align 8164! CHECK-NEXT:    br label %omp.reduction.nonatomic.body165 166!              [various blocks implementing the reduction]167 168! CHECK:       omp.region.cont37:                                ; preds =169! CHECK-NEXT:    %{{.*}} = phi ptr170! CHECK-NEXT:    call void @__kmpc_end_reduce(171! CHECK-NEXT:    br label %reduce.finalize172 173! CHECK:       reduce.finalize:                                  ; preds =174! CHECK-NEXT:    br label %omp.par.pre_finalize175 176! CHECK:       omp.par.pre_finalize:                             ; preds = %reduce.finalize177! CHECK-NEXT:    br label %.fini178 179! CHECK:       .fini:180! CHECK-NEXT:    %{{.*}} = load ptr, ptr181! CHECK-NEXT:    br label %omp.reduction.cleanup182 183! CHECK:       omp.reduction.cleanup:                            ; preds = %.fini184!                [null check]185! CHECK:         br i1 %{{.*}}, label %omp.reduction.cleanup43, label %omp.reduction.cleanup44186 187! CHECK:       omp.reduction.cleanup44:                          ; preds = %omp.reduction.cleanup43, %omp.reduction.cleanup188! CHECK-NEXT:    br label %omp.region.cont42189 190! CHECK:       omp.region.cont42:                                ; preds = %omp.reduction.cleanup44191! CHECK-NEXT:    %{{.*}} = load ptr, ptr192! CHECK-NEXT:    br label %omp.reduction.cleanup46193 194! CHECK:       omp.reduction.cleanup46:                          ; preds = %omp.region.cont42195!                [null check]196! CHECK:         br i1 %{{.*}}, label %omp.reduction.cleanup47, label %omp.reduction.cleanup48197 198! CHECK:       omp.par.region30:                                 ; preds = %omp.par.region29199! CHECK-NEXT:    call void @_FortranAStopStatement200 201! CHECK:       omp.reduction.neutral25:                          ; preds = %omp.reduction.neutral24202!                [source length was zero: finish initializing array]203! CHECK:         br label %omp.reduction.neutral27204 205! CHECK:       omp.reduction.neutral20:                          ; preds = %omp.reduction.neutral206!                [source length was zero: finish initializing array]207! CHECK:         br label %omp.reduction.neutral22208 209! CHECK:       omp.private.copy17:                               ; preds = %omp.private.copy16210!                [source length was non-zero: call assign runtime]211! CHECK:         br label %omp.private.copy18212 213! CHECK:       omp.private.copy13:                               ; preds = %omp.private.copy12214!                [source length was non-zero: call assign runtime]215! CHECK:         br label %omp.private.copy14216 217! CHECK:       omp.private.init8:                               ; preds = %omp.private.init7218!                [var extent was non-zero: malloc a private array]219! CHECK:         br label %omp.private.init10220 221! CHECK:       omp.private.init3:                               ; preds = %omp.private.init2222!                [var extent was non-zero: malloc a private array]223! CHECK:         br label %omp.private.init5224 225! CHECK:       omp.par.exit.exitStub:                           ; preds = %omp.region.cont52226! CHECK-NEXT:    ret void227