@@ -18,130 +18,94 @@ module {
18
18
%8 = llvm.mlir.constant (1 : i32 ) : i32
19
19
%9 = llvm.mlir.constant (10 : i32 ) : i32
20
20
%10 = llvm.mlir.constant (0 : i32 ) : i32
21
- omp.parallel {
22
- %83 = llvm.mlir.constant (1 : i64 ) : i64
23
- %84 = llvm.alloca %83 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> : (i64 ) -> !llvm.ptr
24
- %86 = llvm.mlir.constant (1 : i64 ) : i64
25
- %87 = llvm.alloca %86 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> : (i64 ) -> !llvm.ptr
21
+ %83 = llvm.mlir.constant (1 : i64 ) : i64
22
+ %84 = llvm.alloca %83 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> : (i64 ) -> !llvm.ptr
23
+ %86 = llvm.mlir.constant (1 : i64 ) : i64
24
+ %87 = llvm.alloca %86 x !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)> : (i64 ) -> !llvm.ptr
26
25
// test multiple reduction variables to ensure they don't intefere with eachother
27
26
// when inlining the reduction init region multiple times
28
- omp.wsloop byref reduction (@add_reduction_byref_box_Uxf64 %84 -> %arg3 : !llvm.ptr , @add_reduction_byref_box_Uxf64 %87 -> %arg4 : !llvm.ptr ) for (%arg2 ) : i32 = (%10 ) to (%9 ) inclusive step (%8 ) {
29
- omp.yield
30
- }
27
+ omp.parallel byref reduction (@add_reduction_byref_box_Uxf64 %84 -> %arg3 : !llvm.ptr , @add_reduction_byref_box_Uxf64 %87 -> %arg4 : !llvm.ptr ) {
31
28
omp.terminator
32
29
}
33
30
llvm.return
34
31
}
35
32
}
36
33
37
- // CHECK-LABEL: define internal void @_QFPreduce(ptr %{{.*}}, ptr %{{.*}})
38
- // CHECK: br label %entry
39
- // CHECK: entry: ; preds = %[[VAL_1:.*]]
40
- // CHECK: %[[VAL_2:.*]] = call i32 @__kmpc_global_thread_num( ptr @1)
34
+ // CHECK-LABEL: define internal void @_QFPreduce
35
+ // CHECK: %[[VAL_0:.*]] = alloca { ptr, ptr }, align 8
36
+ // CHECK: %[[VAL_1:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, i64 1, align 8
37
+ // CHECK: %[[VAL_2:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, i64 1, align 8
41
38
// CHECK: br label %[[VAL_3:.*]]
42
- // CHECK: omp_parallel: ; preds = %entry
43
- // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @_QFPreduce..omp_par)
44
- // CHECK: br label %[[VAL_4:.*]]
45
- // CHECK: omp.par.outlined.exit: ; preds = %[[VAL_3]]
46
- // CHECK: br label %[[VAL_5:.*]]
47
- // CHECK: omp.par.exit.split: ; preds = %[[VAL_4]]
39
+ // CHECK: entry: ; preds = %[[VAL_4:.*]]
40
+ // CHECK: %[[VAL_5:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
41
+ // CHECK: br label %[[VAL_6:.*]]
42
+ // CHECK: omp_parallel: ; preds = %[[VAL_3]]
43
+ // CHECK: %[[VAL_7:.*]] = getelementptr { ptr, ptr }, ptr %[[VAL_0]], i32 0, i32 0
44
+ // CHECK: store ptr %[[VAL_1]], ptr %[[VAL_7]], align 8
45
+ // CHECK: %[[VAL_8:.*]] = getelementptr { ptr, ptr }, ptr %[[VAL_0]], i32 0, i32 1
46
+ // CHECK: store ptr %[[VAL_2]], ptr %[[VAL_8]], align 8
47
+ // CHECK: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 1, ptr @_QFPreduce..omp_par, ptr %[[VAL_0]])
48
+ // CHECK: br label %[[VAL_9:.*]]
49
+ // CHECK: omp.par.outlined.exit: ; preds = %[[VAL_6]]
50
+ // CHECK: br label %[[VAL_10:.*]]
51
+ // CHECK: omp.par.exit.split: ; preds = %[[VAL_9]]
48
52
// CHECK: ret void
49
53
// CHECK: omp.par.entry:
50
- // CHECK: %[[VAL_6:.*]] = alloca i32, align 4
51
- // CHECK: %[[VAL_7:.*]] = load i32, ptr %[[VAL_8:.*]], align 4
52
- // CHECK: store i32 %[[VAL_7]], ptr %[[VAL_6]], align 4
53
- // CHECK: %[[VAL_9:.*]] = load i32, ptr %[[VAL_6]], align 4
54
- // CHECK: %[[VAL_10:.*]] = alloca i32, align 4
55
- // CHECK: %[[VAL_11:.*]] = alloca i32, align 4
56
- // CHECK: %[[VAL_12:.*]] = alloca i32, align 4
57
- // CHECK: %[[VAL_13:.*]] = alloca i32, align 4
58
- // CHECK: %[[VAL_14:.*]] = alloca [2 x ptr], align 8
59
- // CHECK: br label %[[VAL_15:.*]]
60
- // CHECK: omp.par.region: ; preds = %[[VAL_16:.*]]
61
- // CHECK: br label %[[VAL_17:.*]]
62
- // CHECK: omp.par.region1: ; preds = %[[VAL_15]]
63
- // CHECK: %[[VAL_18:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, i64 1, align 8
64
- // CHECK: %[[VAL_19:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, i64 1, align 8
65
- // CHECK: %[[VAL_20:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_18]], align 8
54
+ // CHECK: %[[VAL_11:.*]] = getelementptr { ptr, ptr }, ptr %[[VAL_12:.*]], i32 0, i32 0
55
+ // CHECK: %[[VAL_13:.*]] = load ptr, ptr %[[VAL_11]], align 8
56
+ // CHECK: %[[VAL_14:.*]] = getelementptr { ptr, ptr }, ptr %[[VAL_12]], i32 0, i32 1
57
+ // CHECK: %[[VAL_15:.*]] = load ptr, ptr %[[VAL_14]], align 8
58
+ // CHECK: %[[VAL_16:.*]] = alloca i32, align 4
59
+ // CHECK: %[[VAL_17:.*]] = load i32, ptr %[[VAL_18:.*]], align 4
60
+ // CHECK: store i32 %[[VAL_17]], ptr %[[VAL_16]], align 4
61
+ // CHECK: %[[VAL_19:.*]] = load i32, ptr %[[VAL_16]], align 4
62
+ // CHECK: %[[VAL_20:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_13]], align 8
66
63
// CHECK: %[[VAL_21:.*]] = alloca ptr, align 8
67
- // CHECK: store ptr %[[VAL_18 ]], ptr %[[VAL_21]], align 8
68
- // CHECK: %[[VAL_22:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_19 ]], align 8
64
+ // CHECK: store ptr %[[VAL_13 ]], ptr %[[VAL_21]], align 8
65
+ // CHECK: %[[VAL_22:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr %[[VAL_15 ]], align 8
69
66
// CHECK: %[[VAL_23:.*]] = alloca ptr, align 8
70
- // CHECK: store ptr %[[VAL_19]], ptr %[[VAL_23]], align 8
71
- // CHECK: br label %[[VAL_24:.*]]
72
- // CHECK: omp_loop.preheader: ; preds = %[[VAL_17]]
73
- // CHECK: store i32 0, ptr %[[VAL_11]], align 4
74
- // CHECK: store i32 10, ptr %[[VAL_12]], align 4
75
- // CHECK: store i32 1, ptr %[[VAL_13]], align 4
76
- // CHECK: %[[VAL_25:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
77
- // CHECK: call void @__kmpc_for_static_init_4u(ptr @1, i32 %[[VAL_25]], i32 34, ptr %[[VAL_10]], ptr %[[VAL_11]], ptr %[[VAL_12]], ptr %[[VAL_13]], i32 1, i32 0)
78
- // CHECK: %[[VAL_26:.*]] = load i32, ptr %[[VAL_11]], align 4
79
- // CHECK: %[[VAL_27:.*]] = load i32, ptr %[[VAL_12]], align 4
80
- // CHECK: %[[VAL_28:.*]] = sub i32 %[[VAL_27]], %[[VAL_26]]
81
- // CHECK: %[[VAL_29:.*]] = add i32 %[[VAL_28]], 1
82
- // CHECK: br label %[[VAL_30:.*]]
83
- // CHECK: omp_loop.header: ; preds = %[[VAL_31:.*]], %[[VAL_24]]
84
- // CHECK: %[[VAL_32:.*]] = phi i32 [ 0, %[[VAL_24]] ], [ %[[VAL_33:.*]], %[[VAL_31]] ]
85
- // CHECK: br label %[[VAL_34:.*]]
86
- // CHECK: omp_loop.cond: ; preds = %[[VAL_30]]
87
- // CHECK: %[[VAL_35:.*]] = icmp ult i32 %[[VAL_32]], %[[VAL_29]]
88
- // CHECK: br i1 %[[VAL_35]], label %[[VAL_36:.*]], label %[[VAL_37:.*]]
89
- // CHECK: omp_loop.exit: ; preds = %[[VAL_34]]
90
- // CHECK: call void @__kmpc_for_static_fini(ptr @1, i32 %[[VAL_25]])
91
- // CHECK: %[[VAL_38:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
92
- // CHECK: call void @__kmpc_barrier(ptr @2, i32 %[[VAL_38]])
93
- // CHECK: br label %[[VAL_39:.*]]
94
- // CHECK: omp_loop.after: ; preds = %[[VAL_37]]
95
- // CHECK: %[[VAL_40:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_14]], i64 0, i64 0
96
- // CHECK: store ptr %[[VAL_21]], ptr %[[VAL_40]], align 8
97
- // CHECK: %[[VAL_41:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_14]], i64 0, i64 1
98
- // CHECK: store ptr %[[VAL_23]], ptr %[[VAL_41]], align 8
99
- // CHECK: %[[VAL_42:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
100
- // CHECK: %[[VAL_43:.*]] = call i32 @__kmpc_reduce(ptr @1, i32 %[[VAL_42]], i32 2, i64 16, ptr %[[VAL_14]], ptr @.omp.reduction.func, ptr @.gomp_critical_user_.reduction.var)
101
- // CHECK: switch i32 %[[VAL_43]], label %[[VAL_44:.*]] [
102
- // CHECK: i32 1, label %[[VAL_45:.*]]
103
- // CHECK: i32 2, label %[[VAL_46:.*]]
67
+ // CHECK: store ptr %[[VAL_15]], ptr %[[VAL_23]], align 8
68
+ // CHECK: %[[VAL_24:.*]] = alloca [2 x ptr], align 8
69
+ // CHECK: br label %[[VAL_25:.*]]
70
+ // CHECK: omp.par.region: ; preds = %[[VAL_26:.*]]
71
+ // CHECK: br label %[[VAL_27:.*]]
72
+ // CHECK: omp.par.region1: ; preds = %[[VAL_25]]
73
+ // CHECK: br label %[[VAL_28:.*]]
74
+ // CHECK: omp.region.cont: ; preds = %[[VAL_27]]
75
+ // CHECK: %[[VAL_29:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_24]], i64 0, i64 0
76
+ // CHECK: store ptr %[[VAL_21]], ptr %[[VAL_29]], align 8
77
+ // CHECK: %[[VAL_30:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_24]], i64 0, i64 1
78
+ // CHECK: store ptr %[[VAL_23]], ptr %[[VAL_30]], align 8
79
+ // CHECK: %[[VAL_31:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
80
+ // CHECK: %[[VAL_32:.*]] = call i32 @__kmpc_reduce(ptr @1, i32 %[[VAL_31]], i32 2, i64 16, ptr %[[VAL_24]], ptr @.omp.reduction.func, ptr @.gomp_critical_user_.reduction.var)
81
+ // CHECK: switch i32 %[[VAL_32]], label %[[VAL_33:.*]] [
82
+ // CHECK: i32 1, label %[[VAL_34:.*]]
83
+ // CHECK: i32 2, label %[[VAL_35:.*]]
104
84
// CHECK: ]
105
- // CHECK: reduce.switch.atomic: ; preds = %[[VAL_39 ]]
85
+ // CHECK: reduce.switch.atomic: ; preds = %[[VAL_28 ]]
106
86
// CHECK: unreachable
107
- // CHECK: reduce.switch.nonatomic: ; preds = %[[VAL_39]]
108
- // CHECK: %[[VAL_47:.*]] = load ptr, ptr %[[VAL_21]], align 8
109
- // CHECK: %[[VAL_48:.*]] = load ptr, ptr %[[VAL_23]], align 8
110
- // CHECK: call void @__kmpc_end_reduce(ptr @1, i32 %[[VAL_42]], ptr @.gomp_critical_user_.reduction.var)
111
- // CHECK: br label %[[VAL_44]]
112
- // CHECK: reduce.finalize: ; preds = %[[VAL_45]], %[[VAL_39]]
113
- // CHECK: %[[VAL_49:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
114
- // CHECK: call void @__kmpc_barrier(ptr @2, i32 %[[VAL_49]])
115
- // CHECK: br label %[[VAL_50:.*]]
116
- // CHECK: omp.region.cont: ; preds = %[[VAL_44]]
117
- // CHECK: br label %[[VAL_51:.*]]
118
- // CHECK: omp.par.pre_finalize: ; preds = %[[VAL_50]]
119
- // CHECK: br label %[[VAL_52:.*]]
120
- // CHECK: omp_loop.body: ; preds = %[[VAL_34]]
121
- // CHECK: %[[VAL_53:.*]] = add i32 %[[VAL_32]], %[[VAL_26]]
122
- // CHECK: %[[VAL_54:.*]] = mul i32 %[[VAL_53]], 1
123
- // CHECK: %[[VAL_55:.*]] = add i32 %[[VAL_54]], 0
124
- // CHECK: br label %[[VAL_56:.*]]
125
- // CHECK: omp.wsloop.region: ; preds = %[[VAL_36]]
126
- // CHECK: br label %[[VAL_57:.*]]
127
- // CHECK: omp.region.cont2: ; preds = %[[VAL_56]]
128
- // CHECK: br label %[[VAL_31]]
129
- // CHECK: omp_loop.inc: ; preds = %[[VAL_57]]
130
- // CHECK: %[[VAL_33]] = add nuw i32 %[[VAL_32]], 1
131
- // CHECK: br label %[[VAL_30]]
132
- // CHECK: omp.par.outlined.exit.exitStub: ; preds = %[[VAL_51]]
87
+ // CHECK: reduce.switch.nonatomic: ; preds = %[[VAL_28]]
88
+ // CHECK: %[[VAL_36:.*]] = load ptr, ptr %[[VAL_21]], align 8
89
+ // CHECK: %[[VAL_37:.*]] = load ptr, ptr %[[VAL_23]], align 8
90
+ // CHECK: call void @__kmpc_end_reduce(ptr @1, i32 %[[VAL_31]], ptr @.gomp_critical_user_.reduction.var)
91
+ // CHECK: br label %[[VAL_33]]
92
+ // CHECK: reduce.finalize: ; preds = %[[VAL_34]], %[[VAL_28]]
93
+ // CHECK: br label %[[VAL_38:.*]]
94
+ // CHECK: omp.par.pre_finalize: ; preds = %[[VAL_33]]
95
+ // CHECK: br label %[[VAL_39:.*]]
96
+ // CHECK: omp.par.outlined.exit.exitStub: ; preds = %[[VAL_38]]
133
97
// CHECK: ret void
134
- // CHECK: %[[VAL_58 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_59 :.*]], i64 0, i64 0
135
- // CHECK: %[[VAL_60 :.*]] = load ptr, ptr %[[VAL_58 ]], align 8
136
- // CHECK: %[[VAL_61 :.*]] = load ptr, ptr %[[VAL_60 ]], align 8
137
- // CHECK: %[[VAL_62 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_63 :.*]], i64 0, i64 0
138
- // CHECK: %[[VAL_64 :.*]] = load ptr, ptr %[[VAL_62 ]], align 8
139
- // CHECK: %[[VAL_65 :.*]] = load ptr, ptr %[[VAL_64 ]], align 8
140
- // CHECK: %[[VAL_66 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_59 ]], i64 0, i64 1
141
- // CHECK: %[[VAL_67 :.*]] = load ptr, ptr %[[VAL_66 ]], align 8
142
- // CHECK: %[[VAL_68 :.*]] = load ptr, ptr %[[VAL_67 ]], align 8
143
- // CHECK: %[[VAL_69 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_63 ]], i64 0, i64 1
144
- // CHECK: %[[VAL_70 :.*]] = load ptr, ptr %[[VAL_69 ]], align 8
145
- // CHECK: %[[VAL_71 :.*]] = load ptr, ptr %[[VAL_70 ]], align 8
98
+ // CHECK: %[[VAL_40 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_41 :.*]], i64 0, i64 0
99
+ // CHECK: %[[VAL_42 :.*]] = load ptr, ptr %[[VAL_40 ]], align 8
100
+ // CHECK: %[[VAL_43 :.*]] = load ptr, ptr %[[VAL_42 ]], align 8
101
+ // CHECK: %[[VAL_44 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_45 :.*]], i64 0, i64 0
102
+ // CHECK: %[[VAL_46 :.*]] = load ptr, ptr %[[VAL_44 ]], align 8
103
+ // CHECK: %[[VAL_47 :.*]] = load ptr, ptr %[[VAL_46 ]], align 8
104
+ // CHECK: %[[VAL_48 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_41 ]], i64 0, i64 1
105
+ // CHECK: %[[VAL_49 :.*]] = load ptr, ptr %[[VAL_48 ]], align 8
106
+ // CHECK: %[[VAL_50 :.*]] = load ptr, ptr %[[VAL_49 ]], align 8
107
+ // CHECK: %[[VAL_51 :.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_45 ]], i64 0, i64 1
108
+ // CHECK: %[[VAL_52 :.*]] = load ptr, ptr %[[VAL_51 ]], align 8
109
+ // CHECK: %[[VAL_53 :.*]] = load ptr, ptr %[[VAL_52 ]], align 8
146
110
// CHECK: ret void
147
111
0 commit comments