|
| 1 | +// RUN: mlir-translate --mlir-to-llvmir %s | FileCheck %s |
| 2 | + |
| 3 | +llvm.func @cancellation_point_parallel() { |
| 4 | + omp.parallel { |
| 5 | + omp.cancellation_point cancellation_construct_type(parallel) |
| 6 | + omp.terminator |
| 7 | + } |
| 8 | + llvm.return |
| 9 | +} |
| 10 | +// CHECK-LABEL: define internal void @cancellation_point_parallel..omp_par |
| 11 | +// CHECK: omp.par.entry: |
| 12 | +// CHECK: %[[VAL_5:.*]] = alloca i32, align 4 |
| 13 | +// CHECK: %[[VAL_6:.*]] = load i32, ptr %[[VAL_7:.*]], align 4 |
| 14 | +// CHECK: store i32 %[[VAL_6]], ptr %[[VAL_5]], align 4 |
| 15 | +// CHECK: %[[VAL_8:.*]] = load i32, ptr %[[VAL_5]], align 4 |
| 16 | +// CHECK: br label %[[VAL_9:.*]] |
| 17 | +// CHECK: omp.region.after_alloca: ; preds = %[[VAL_10:.*]] |
| 18 | +// CHECK: br label %[[VAL_11:.*]] |
| 19 | +// CHECK: omp.par.region: ; preds = %[[VAL_9]] |
| 20 | +// CHECK: br label %[[VAL_12:.*]] |
| 21 | +// CHECK: omp.par.region1: ; preds = %[[VAL_11]] |
| 22 | +// CHECK: %[[VAL_13:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 23 | +// CHECK: %[[VAL_14:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[VAL_13]], i32 1) |
| 24 | +// CHECK: %[[VAL_15:.*]] = icmp eq i32 %[[VAL_14]], 0 |
| 25 | +// CHECK: br i1 %[[VAL_15]], label %[[VAL_16:.*]], label %[[VAL_17:.*]] |
| 26 | +// CHECK: omp.par.region1.cncl: ; preds = %[[VAL_12]] |
| 27 | +// CHECK: %[[VAL_18:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 28 | +// CHECK: %[[VAL_19:.*]] = call i32 @__kmpc_cancel_barrier(ptr @2, i32 %[[VAL_18]]) |
| 29 | +// CHECK: br label %[[VAL_20:.*]] |
| 30 | +// CHECK: omp.par.region1.split: ; preds = %[[VAL_12]] |
| 31 | +// CHECK: br label %[[VAL_21:.*]] |
| 32 | +// CHECK: omp.region.cont: ; preds = %[[VAL_16]] |
| 33 | +// CHECK: br label %[[VAL_22:.*]] |
| 34 | +// CHECK: omp.par.pre_finalize: ; preds = %[[VAL_21]] |
| 35 | +// CHECK: br label %[[VAL_20]] |
| 36 | +// CHECK: omp.par.exit.exitStub: ; preds = %[[VAL_22]], %[[VAL_17]] |
| 37 | +// CHECK: ret void |
| 38 | + |
| 39 | +llvm.func @cancellation_point_sections() { |
| 40 | + omp.sections { |
| 41 | + omp.section { |
| 42 | + omp.cancellation_point cancellation_construct_type(sections) |
| 43 | + omp.terminator |
| 44 | + } |
| 45 | + omp.terminator |
| 46 | + } |
| 47 | + llvm.return |
| 48 | +} |
| 49 | +// CHECK-LABEL: define void @cancellation_point_sections |
| 50 | +// CHECK: %[[VAL_23:.*]] = alloca i32, align 4 |
| 51 | +// CHECK: %[[VAL_24:.*]] = alloca i32, align 4 |
| 52 | +// CHECK: %[[VAL_25:.*]] = alloca i32, align 4 |
| 53 | +// CHECK: %[[VAL_26:.*]] = alloca i32, align 4 |
| 54 | +// CHECK: br label %[[VAL_27:.*]] |
| 55 | +// CHECK: entry: ; preds = %[[VAL_28:.*]] |
| 56 | +// CHECK: br label %[[VAL_29:.*]] |
| 57 | +// CHECK: omp_section_loop.preheader: ; preds = %[[VAL_27]] |
| 58 | +// CHECK: store i32 0, ptr %[[VAL_24]], align 4 |
| 59 | +// CHECK: store i32 0, ptr %[[VAL_25]], align 4 |
| 60 | +// CHECK: store i32 1, ptr %[[VAL_26]], align 4 |
| 61 | +// CHECK: %[[VAL_30:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 62 | +// CHECK: call void @__kmpc_for_static_init_4u(ptr @1, i32 %[[VAL_30]], i32 34, ptr %[[VAL_23]], ptr %[[VAL_24]], ptr %[[VAL_25]], ptr %[[VAL_26]], i32 1, i32 0) |
| 63 | +// CHECK: %[[VAL_31:.*]] = load i32, ptr %[[VAL_24]], align 4 |
| 64 | +// CHECK: %[[VAL_32:.*]] = load i32, ptr %[[VAL_25]], align 4 |
| 65 | +// CHECK: %[[VAL_33:.*]] = sub i32 %[[VAL_32]], %[[VAL_31]] |
| 66 | +// CHECK: %[[VAL_34:.*]] = add i32 %[[VAL_33]], 1 |
| 67 | +// CHECK: br label %[[VAL_35:.*]] |
| 68 | +// CHECK: omp_section_loop.header: ; preds = %[[VAL_36:.*]], %[[VAL_29]] |
| 69 | +// CHECK: %[[VAL_37:.*]] = phi i32 [ 0, %[[VAL_29]] ], [ %[[VAL_38:.*]], %[[VAL_36]] ] |
| 70 | +// CHECK: br label %[[VAL_39:.*]] |
| 71 | +// CHECK: omp_section_loop.cond: ; preds = %[[VAL_35]] |
| 72 | +// CHECK: %[[VAL_40:.*]] = icmp ult i32 %[[VAL_37]], %[[VAL_34]] |
| 73 | +// CHECK: br i1 %[[VAL_40]], label %[[VAL_41:.*]], label %[[VAL_42:.*]] |
| 74 | +// CHECK: omp_section_loop.body: ; preds = %[[VAL_39]] |
| 75 | +// CHECK: %[[VAL_43:.*]] = add i32 %[[VAL_37]], %[[VAL_31]] |
| 76 | +// CHECK: %[[VAL_44:.*]] = mul i32 %[[VAL_43]], 1 |
| 77 | +// CHECK: %[[VAL_45:.*]] = add i32 %[[VAL_44]], 0 |
| 78 | +// CHECK: switch i32 %[[VAL_45]], label %[[VAL_46:.*]] [ |
| 79 | +// CHECK: i32 0, label %[[VAL_47:.*]] |
| 80 | +// CHECK: ] |
| 81 | +// CHECK: omp_section_loop.body.case: ; preds = %[[VAL_41]] |
| 82 | +// CHECK: br label %[[VAL_48:.*]] |
| 83 | +// CHECK: omp.section.region: ; preds = %[[VAL_47]] |
| 84 | +// CHECK: %[[VAL_49:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 85 | +// CHECK: %[[VAL_50:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[VAL_49]], i32 3) |
| 86 | +// CHECK: %[[VAL_51:.*]] = icmp eq i32 %[[VAL_50]], 0 |
| 87 | +// CHECK: br i1 %[[VAL_51]], label %[[VAL_52:.*]], label %[[VAL_53:.*]] |
| 88 | +// CHECK: omp.section.region.split: ; preds = %[[VAL_48]] |
| 89 | +// CHECK: br label %[[VAL_54:.*]] |
| 90 | +// CHECK: omp.region.cont: ; preds = %[[VAL_52]] |
| 91 | +// CHECK: br label %[[VAL_46]] |
| 92 | +// CHECK: omp_section_loop.body.sections.after: ; preds = %[[VAL_54]], %[[VAL_41]] |
| 93 | +// CHECK: br label %[[VAL_36]] |
| 94 | +// CHECK: omp_section_loop.inc: ; preds = %[[VAL_46]] |
| 95 | +// CHECK: %[[VAL_38]] = add nuw i32 %[[VAL_37]], 1 |
| 96 | +// CHECK: br label %[[VAL_35]] |
| 97 | +// CHECK: omp_section_loop.exit: ; preds = %[[VAL_53]], %[[VAL_39]] |
| 98 | +// CHECK: call void @__kmpc_for_static_fini(ptr @1, i32 %[[VAL_30]]) |
| 99 | +// CHECK: %[[VAL_55:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 100 | +// CHECK: call void @__kmpc_barrier(ptr @2, i32 %[[VAL_55]]) |
| 101 | +// CHECK: br label %[[VAL_56:.*]] |
| 102 | +// CHECK: omp_section_loop.after: ; preds = %[[VAL_42]] |
| 103 | +// CHECK: br label %[[VAL_57:.*]] |
| 104 | +// CHECK: omp_section_loop.aftersections.fini: ; preds = %[[VAL_56]] |
| 105 | +// CHECK: ret void |
| 106 | +// CHECK: omp.section.region.cncl: ; preds = %[[VAL_48]] |
| 107 | +// CHECK: br label %[[VAL_42]] |
| 108 | + |
| 109 | +llvm.func @cancellation_point_wsloop(%lb : i32, %ub : i32, %step : i32) { |
| 110 | + omp.wsloop { |
| 111 | + omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) { |
| 112 | + omp.cancellation_point cancellation_construct_type(loop) |
| 113 | + omp.yield |
| 114 | + } |
| 115 | + } |
| 116 | + llvm.return |
| 117 | +} |
| 118 | +// CHECK-LABEL: define void @cancellation_point_wsloop |
| 119 | +// CHECK: %[[VAL_58:.*]] = alloca i32, align 4 |
| 120 | +// CHECK: %[[VAL_59:.*]] = alloca i32, align 4 |
| 121 | +// CHECK: %[[VAL_60:.*]] = alloca i32, align 4 |
| 122 | +// CHECK: %[[VAL_61:.*]] = alloca i32, align 4 |
| 123 | +// CHECK: br label %[[VAL_62:.*]] |
| 124 | +// CHECK: omp.region.after_alloca: ; preds = %[[VAL_63:.*]] |
| 125 | +// CHECK: br label %[[VAL_64:.*]] |
| 126 | +// CHECK: entry: ; preds = %[[VAL_62]] |
| 127 | +// CHECK: br label %[[VAL_65:.*]] |
| 128 | +// CHECK: omp.wsloop.region: ; preds = %[[VAL_64]] |
| 129 | +// CHECK: %[[VAL_66:.*]] = icmp slt i32 %[[VAL_67:.*]], 0 |
| 130 | +// CHECK: %[[VAL_68:.*]] = sub i32 0, %[[VAL_67]] |
| 131 | +// CHECK: %[[VAL_69:.*]] = select i1 %[[VAL_66]], i32 %[[VAL_68]], i32 %[[VAL_67]] |
| 132 | +// CHECK: %[[VAL_70:.*]] = select i1 %[[VAL_66]], i32 %[[VAL_71:.*]], i32 %[[VAL_72:.*]] |
| 133 | +// CHECK: %[[VAL_73:.*]] = select i1 %[[VAL_66]], i32 %[[VAL_72]], i32 %[[VAL_71]] |
| 134 | +// CHECK: %[[VAL_74:.*]] = sub nsw i32 %[[VAL_73]], %[[VAL_70]] |
| 135 | +// CHECK: %[[VAL_75:.*]] = icmp sle i32 %[[VAL_73]], %[[VAL_70]] |
| 136 | +// CHECK: %[[VAL_76:.*]] = sub i32 %[[VAL_74]], 1 |
| 137 | +// CHECK: %[[VAL_77:.*]] = udiv i32 %[[VAL_76]], %[[VAL_69]] |
| 138 | +// CHECK: %[[VAL_78:.*]] = add i32 %[[VAL_77]], 1 |
| 139 | +// CHECK: %[[VAL_79:.*]] = icmp ule i32 %[[VAL_74]], %[[VAL_69]] |
| 140 | +// CHECK: %[[VAL_80:.*]] = select i1 %[[VAL_79]], i32 1, i32 %[[VAL_78]] |
| 141 | +// CHECK: %[[VAL_81:.*]] = select i1 %[[VAL_75]], i32 0, i32 %[[VAL_80]] |
| 142 | +// CHECK: br label %[[VAL_82:.*]] |
| 143 | +// CHECK: omp_loop.preheader: ; preds = %[[VAL_65]] |
| 144 | +// CHECK: store i32 0, ptr %[[VAL_59]], align 4 |
| 145 | +// CHECK: %[[VAL_83:.*]] = sub i32 %[[VAL_81]], 1 |
| 146 | +// CHECK: store i32 %[[VAL_83]], ptr %[[VAL_60]], align 4 |
| 147 | +// CHECK: store i32 1, ptr %[[VAL_61]], align 4 |
| 148 | +// CHECK: %[[VAL_84:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 149 | +// CHECK: call void @__kmpc_for_static_init_4u(ptr @1, i32 %[[VAL_84]], i32 34, ptr %[[VAL_58]], ptr %[[VAL_59]], ptr %[[VAL_60]], ptr %[[VAL_61]], i32 1, i32 0) |
| 150 | +// CHECK: %[[VAL_85:.*]] = load i32, ptr %[[VAL_59]], align 4 |
| 151 | +// CHECK: %[[VAL_86:.*]] = load i32, ptr %[[VAL_60]], align 4 |
| 152 | +// CHECK: %[[VAL_87:.*]] = sub i32 %[[VAL_86]], %[[VAL_85]] |
| 153 | +// CHECK: %[[VAL_88:.*]] = add i32 %[[VAL_87]], 1 |
| 154 | +// CHECK: br label %[[VAL_89:.*]] |
| 155 | +// CHECK: omp_loop.header: ; preds = %[[VAL_90:.*]], %[[VAL_82]] |
| 156 | +// CHECK: %[[VAL_91:.*]] = phi i32 [ 0, %[[VAL_82]] ], [ %[[VAL_92:.*]], %[[VAL_90]] ] |
| 157 | +// CHECK: br label %[[VAL_93:.*]] |
| 158 | +// CHECK: omp_loop.cond: ; preds = %[[VAL_89]] |
| 159 | +// CHECK: %[[VAL_94:.*]] = icmp ult i32 %[[VAL_91]], %[[VAL_88]] |
| 160 | +// CHECK: br i1 %[[VAL_94]], label %[[VAL_95:.*]], label %[[VAL_96:.*]] |
| 161 | +// CHECK: omp_loop.body: ; preds = %[[VAL_93]] |
| 162 | +// CHECK: %[[VAL_97:.*]] = add i32 %[[VAL_91]], %[[VAL_85]] |
| 163 | +// CHECK: %[[VAL_98:.*]] = mul i32 %[[VAL_97]], %[[VAL_67]] |
| 164 | +// CHECK: %[[VAL_99:.*]] = add i32 %[[VAL_98]], %[[VAL_72]] |
| 165 | +// CHECK: br label %[[VAL_100:.*]] |
| 166 | +// CHECK: omp.loop_nest.region: ; preds = %[[VAL_95]] |
| 167 | +// CHECK: %[[VAL_101:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 168 | +// CHECK: %[[VAL_102:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[VAL_101]], i32 2) |
| 169 | +// CHECK: %[[VAL_103:.*]] = icmp eq i32 %[[VAL_102]], 0 |
| 170 | +// CHECK: br i1 %[[VAL_103]], label %[[VAL_104:.*]], label %[[VAL_105:.*]] |
| 171 | +// CHECK: omp.loop_nest.region.split: ; preds = %[[VAL_100]] |
| 172 | +// CHECK: br label %[[VAL_106:.*]] |
| 173 | +// CHECK: omp.region.cont1: ; preds = %[[VAL_104]] |
| 174 | +// CHECK: br label %[[VAL_90]] |
| 175 | +// CHECK: omp_loop.inc: ; preds = %[[VAL_106]] |
| 176 | +// CHECK: %[[VAL_92]] = add nuw i32 %[[VAL_91]], 1 |
| 177 | +// CHECK: br label %[[VAL_89]] |
| 178 | +// CHECK: omp_loop.exit: ; preds = %[[VAL_105]], %[[VAL_93]] |
| 179 | +// CHECK: call void @__kmpc_for_static_fini(ptr @1, i32 %[[VAL_84]]) |
| 180 | +// CHECK: %[[VAL_107:.*]] = call i32 @__kmpc_global_thread_num(ptr @1) |
| 181 | +// CHECK: call void @__kmpc_barrier(ptr @2, i32 %[[VAL_107]]) |
| 182 | +// CHECK: br label %[[VAL_108:.*]] |
| 183 | +// CHECK: omp_loop.after: ; preds = %[[VAL_96]] |
| 184 | +// CHECK: br label %[[VAL_109:.*]] |
| 185 | +// CHECK: omp.region.cont: ; preds = %[[VAL_108]] |
| 186 | +// CHECK: ret void |
| 187 | +// CHECK: omp.loop_nest.region.cncl: ; preds = %[[VAL_100]] |
| 188 | +// CHECK: br label %[[VAL_96]] |
0 commit comments