xref: /llvm-project/llvm/test/Transforms/SCCP/openmp_parallel_for.ll (revision 0991da36906bdb29b8f1030d5123bafb58fee79e)
1599955ebSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
28ebb3eacSBjorn Pettersson; RUN: opt -S -passes=ipsccp < %s | FileCheck %s
3599955ebSFlorian Hahn;
4599955ebSFlorian Hahn;    void bar(int, float, double);
5599955ebSFlorian Hahn;
6599955ebSFlorian Hahn;    void foo(int N) {
7599955ebSFlorian Hahn;      float p = 3;
8599955ebSFlorian Hahn;      double q = 5;
9599955ebSFlorian Hahn;      N = 7;
10599955ebSFlorian Hahn;
11599955ebSFlorian Hahn;    #pragma omp parallel for firstprivate(q)
12599955ebSFlorian Hahn;      for (int i = 2; i < N; i++) {
13599955ebSFlorian Hahn;        bar(i, p, q);
14599955ebSFlorian Hahn;      }
15599955ebSFlorian Hahn;    }
16599955ebSFlorian Hahn;
17599955ebSFlorian Hahn; Verify the constant value of q is propagated into the outlined function.
18599955ebSFlorian Hahn;
19599955ebSFlorian Hahntarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
20599955ebSFlorian Hahn
21*0991da36SNikita Popov%struct.ident_t = type { i32, i32, i32, i32, ptr }
22599955ebSFlorian Hahn
23599955ebSFlorian Hahn@.str = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
24*0991da36SNikita Popov@0 = private unnamed_addr global %struct.ident_t { i32 0, i32 514, i32 0, i32 0, ptr @.str }, align 8
25*0991da36SNikita Popov@1 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, ptr @.str }, align 8
26599955ebSFlorian Hahn
27599955ebSFlorian Hahndefine dso_local void @foo(i32 %N) {
28599955ebSFlorian Hahn; CHECK-LABEL: @foo(
29599955ebSFlorian Hahn; CHECK-NEXT:  entry:
30599955ebSFlorian Hahn; CHECK-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
31599955ebSFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = alloca float, align 4
32*0991da36SNikita Popov; CHECK-NEXT:    store i32 [[N:%.*]], ptr [[N_ADDR]], align 4
33*0991da36SNikita Popov; CHECK-NEXT:    store float 3.000000e+00, ptr [[P]], align 4
34*0991da36SNikita Popov; CHECK-NEXT:    store i32 7, ptr [[N_ADDR]], align 4
35*0991da36SNikita Popov; CHECK-NEXT:    call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 3, ptr @.omp_outlined., ptr nonnull [[N_ADDR]], ptr nonnull [[P]], i64 4617315517961601024)
36599955ebSFlorian Hahn; CHECK-NEXT:    ret void
37599955ebSFlorian Hahn;
38599955ebSFlorian Hahnentry:
39599955ebSFlorian Hahn  %N.addr = alloca i32, align 4
40599955ebSFlorian Hahn  %p = alloca float, align 4
41*0991da36SNikita Popov  store i32 %N, ptr %N.addr, align 4
42*0991da36SNikita Popov  store float 3.000000e+00, ptr %p, align 4
43*0991da36SNikita Popov  store i32 7, ptr %N.addr, align 4
44*0991da36SNikita Popov  call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @1, i32 3, ptr @.omp_outlined., ptr nonnull %N.addr, ptr nonnull %p, i64 4617315517961601024)
45599955ebSFlorian Hahn  ret void
46599955ebSFlorian Hahn}
47599955ebSFlorian Hahn
48*0991da36SNikita Popovdefine internal void @.omp_outlined.(ptr noalias %.global_tid., ptr noalias %.bound_tid., ptr dereferenceable(4) %N, ptr dereferenceable(4) %p, i64 %q) {
49599955ebSFlorian Hahn; CHECK-LABEL: @.omp_outlined.(
50599955ebSFlorian Hahn; CHECK-NEXT:  entry:
51599955ebSFlorian Hahn; CHECK-NEXT:    [[Q_ADDR:%.*]] = alloca i64, align 8
52599955ebSFlorian Hahn; CHECK-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
53599955ebSFlorian Hahn; CHECK-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
54599955ebSFlorian Hahn; CHECK-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
55599955ebSFlorian Hahn; CHECK-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
56*0991da36SNikita Popov; CHECK-NEXT:    store i64 [[Q:%.*]], ptr [[Q_ADDR]], align 8
57*0991da36SNikita Popov; CHECK-NEXT:    [[TMP:%.*]] = load i32, ptr [[N:%.*]], align 4
58599955ebSFlorian Hahn; CHECK-NEXT:    [[SUB3:%.*]] = add nsw i32 [[TMP]], -3
59599955ebSFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2
60599955ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
61599955ebSFlorian Hahn; CHECK:       omp.precond.then:
62*0991da36SNikita Popov; CHECK-NEXT:    store i32 0, ptr [[DOTOMP_LB]], align 4
63*0991da36SNikita Popov; CHECK-NEXT:    store i32 [[SUB3]], ptr [[DOTOMP_UB]], align 4
64*0991da36SNikita Popov; CHECK-NEXT:    store i32 1, ptr [[DOTOMP_STRIDE]], align 4
65*0991da36SNikita Popov; CHECK-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
66*0991da36SNikita Popov; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[DOTGLOBAL_TID_:%.*]], align 4
67*0991da36SNikita Popov; CHECK-NEXT:    call void @__kmpc_for_static_init_4(ptr nonnull @0, i32 [[TMP5]], i32 34, ptr nonnull [[DOTOMP_IS_LAST]], ptr nonnull [[DOTOMP_LB]], ptr nonnull [[DOTOMP_UB]], ptr nonnull [[DOTOMP_STRIDE]], i32 1, i32 1)
68*0991da36SNikita Popov; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
69599955ebSFlorian Hahn; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]
70599955ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
71599955ebSFlorian Hahn; CHECK:       cond.true:
72599955ebSFlorian Hahn; CHECK-NEXT:    br label [[COND_END:%.*]]
73599955ebSFlorian Hahn; CHECK:       cond.false:
74*0991da36SNikita Popov; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
75599955ebSFlorian Hahn; CHECK-NEXT:    br label [[COND_END]]
76599955ebSFlorian Hahn; CHECK:       cond.end:
77599955ebSFlorian Hahn; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]
78*0991da36SNikita Popov; CHECK-NEXT:    store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
79*0991da36SNikita Popov; CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
80599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]
81599955ebSFlorian Hahn; CHECK:       omp.inner.for.cond:
82599955ebSFlorian Hahn; CHECK-NEXT:    [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]
83*0991da36SNikita Popov; CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
84599955ebSFlorian Hahn; CHECK-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]
85599955ebSFlorian Hahn; CHECK-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]
86599955ebSFlorian Hahn; CHECK:       omp.inner.for.cond.cleanup:
87599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]
88599955ebSFlorian Hahn; CHECK:       omp.inner.for.body:
89599955ebSFlorian Hahn; CHECK-NEXT:    [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2
90*0991da36SNikita Popov; CHECK-NEXT:    [[TMP10:%.*]] = load float, ptr [[P:%.*]], align 4
91*0991da36SNikita Popov; CHECK-NEXT:    [[TMP11:%.*]] = load double, ptr [[Q_ADDR]], align 8
92599955ebSFlorian Hahn; CHECK-NEXT:    call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])
93599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]
94599955ebSFlorian Hahn; CHECK:       omp.body.continue:
95599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_INNER_FOR_INC]]
96599955ebSFlorian Hahn; CHECK:       omp.inner.for.inc:
97599955ebSFlorian Hahn; CHECK-NEXT:    [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1
98599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_INNER_FOR_COND]]
99599955ebSFlorian Hahn; CHECK:       omp.inner.for.end:
100599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]
101599955ebSFlorian Hahn; CHECK:       omp.loop.exit:
102*0991da36SNikita Popov; CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4
103*0991da36SNikita Popov; CHECK-NEXT:    call void @__kmpc_for_static_fini(ptr nonnull @0, i32 [[TMP12]])
104599955ebSFlorian Hahn; CHECK-NEXT:    br label [[OMP_PRECOND_END]]
105599955ebSFlorian Hahn; CHECK:       omp.precond.end:
106599955ebSFlorian Hahn; CHECK-NEXT:    ret void
107599955ebSFlorian Hahn;
108599955ebSFlorian Hahnentry:
109599955ebSFlorian Hahn  %q.addr = alloca i64, align 8
110599955ebSFlorian Hahn  %.omp.lb = alloca i32, align 4
111599955ebSFlorian Hahn  %.omp.ub = alloca i32, align 4
112599955ebSFlorian Hahn  %.omp.stride = alloca i32, align 4
113599955ebSFlorian Hahn  %.omp.is_last = alloca i32, align 4
114*0991da36SNikita Popov  store i64 %q, ptr %q.addr, align 8
115*0991da36SNikita Popov  %tmp = load i32, ptr %N, align 4
116599955ebSFlorian Hahn  %sub3 = add nsw i32 %tmp, -3
117599955ebSFlorian Hahn  %cmp = icmp sgt i32 %tmp, 2
118599955ebSFlorian Hahn  br i1 %cmp, label %omp.precond.then, label %omp.precond.end
119599955ebSFlorian Hahn
120599955ebSFlorian Hahnomp.precond.then:                                 ; preds = %entry
121*0991da36SNikita Popov  store i32 0, ptr %.omp.lb, align 4
122*0991da36SNikita Popov  store i32 %sub3, ptr %.omp.ub, align 4
123*0991da36SNikita Popov  store i32 1, ptr %.omp.stride, align 4
124*0991da36SNikita Popov  store i32 0, ptr %.omp.is_last, align 4
125*0991da36SNikita Popov  %tmp5 = load i32, ptr %.global_tid., align 4
126*0991da36SNikita Popov  call void @__kmpc_for_static_init_4(ptr nonnull @0, i32 %tmp5, i32 34, ptr nonnull %.omp.is_last, ptr nonnull %.omp.lb, ptr nonnull %.omp.ub, ptr nonnull %.omp.stride, i32 1, i32 1)
127*0991da36SNikita Popov  %tmp6 = load i32, ptr %.omp.ub, align 4
128599955ebSFlorian Hahn  %cmp6 = icmp sgt i32 %tmp6, %sub3
129599955ebSFlorian Hahn  br i1 %cmp6, label %cond.true, label %cond.false
130599955ebSFlorian Hahn
131599955ebSFlorian Hahncond.true:                                        ; preds = %omp.precond.then
132599955ebSFlorian Hahn  br label %cond.end
133599955ebSFlorian Hahn
134599955ebSFlorian Hahncond.false:                                       ; preds = %omp.precond.then
135*0991da36SNikita Popov  %tmp7 = load i32, ptr %.omp.ub, align 4
136599955ebSFlorian Hahn  br label %cond.end
137599955ebSFlorian Hahn
138599955ebSFlorian Hahncond.end:                                         ; preds = %cond.false, %cond.true
139599955ebSFlorian Hahn  %cond = phi i32 [ %sub3, %cond.true ], [ %tmp7, %cond.false ]
140*0991da36SNikita Popov  store i32 %cond, ptr %.omp.ub, align 4
141*0991da36SNikita Popov  %tmp8 = load i32, ptr %.omp.lb, align 4
142599955ebSFlorian Hahn  br label %omp.inner.for.cond
143599955ebSFlorian Hahn
144599955ebSFlorian Hahnomp.inner.for.cond:                               ; preds = %omp.inner.for.inc, %cond.end
145599955ebSFlorian Hahn  %.omp.iv.0 = phi i32 [ %tmp8, %cond.end ], [ %add11, %omp.inner.for.inc ]
146*0991da36SNikita Popov  %tmp9 = load i32, ptr %.omp.ub, align 4
147599955ebSFlorian Hahn  %cmp8 = icmp sgt i32 %.omp.iv.0, %tmp9
148599955ebSFlorian Hahn  br i1 %cmp8, label %omp.inner.for.cond.cleanup, label %omp.inner.for.body
149599955ebSFlorian Hahn
150599955ebSFlorian Hahnomp.inner.for.cond.cleanup:                       ; preds = %omp.inner.for.cond
151599955ebSFlorian Hahn  br label %omp.inner.for.end
152599955ebSFlorian Hahn
153599955ebSFlorian Hahnomp.inner.for.body:                               ; preds = %omp.inner.for.cond
154599955ebSFlorian Hahn  %add10 = add nsw i32 %.omp.iv.0, 2
155*0991da36SNikita Popov  %tmp10 = load float, ptr %p, align 4
156*0991da36SNikita Popov  %tmp11 = load double, ptr %q.addr, align 8
157599955ebSFlorian Hahn  call void @bar(i32 %add10, float %tmp10, double %tmp11)
158599955ebSFlorian Hahn  br label %omp.body.continue
159599955ebSFlorian Hahn
160599955ebSFlorian Hahnomp.body.continue:                                ; preds = %omp.inner.for.body
161599955ebSFlorian Hahn  br label %omp.inner.for.inc
162599955ebSFlorian Hahn
163599955ebSFlorian Hahnomp.inner.for.inc:                                ; preds = %omp.body.continue
164599955ebSFlorian Hahn  %add11 = add nsw i32 %.omp.iv.0, 1
165599955ebSFlorian Hahn  br label %omp.inner.for.cond
166599955ebSFlorian Hahn
167599955ebSFlorian Hahnomp.inner.for.end:                                ; preds = %omp.inner.for.cond.cleanup
168599955ebSFlorian Hahn  br label %omp.loop.exit
169599955ebSFlorian Hahn
170599955ebSFlorian Hahnomp.loop.exit:                                    ; preds = %omp.inner.for.end
171*0991da36SNikita Popov  %tmp12 = load i32, ptr %.global_tid., align 4
172*0991da36SNikita Popov  call void @__kmpc_for_static_fini(ptr nonnull @0, i32 %tmp12)
173599955ebSFlorian Hahn  br label %omp.precond.end
174599955ebSFlorian Hahn
175599955ebSFlorian Hahnomp.precond.end:                                  ; preds = %omp.loop.exit, %entry
176599955ebSFlorian Hahn  ret void
177599955ebSFlorian Hahn}
178599955ebSFlorian Hahn
179*0991da36SNikita Popovdeclare dso_local void @__kmpc_for_static_init_4(ptr, i32, i32, ptr, ptr, ptr, ptr, i32, i32)
180599955ebSFlorian Hahn
181599955ebSFlorian Hahndeclare dso_local void @bar(i32, float, double)
182599955ebSFlorian Hahn
183*0991da36SNikita Popovdeclare dso_local void @__kmpc_for_static_fini(ptr, i32)
184599955ebSFlorian Hahn
185*0991da36SNikita Popovdeclare !callback !0 dso_local void @__kmpc_fork_call(ptr, i32, ptr, ...)
186599955ebSFlorian Hahn
187599955ebSFlorian Hahn!1 = !{i64 2, i64 -1, i64 -1, i1 true}
188599955ebSFlorian Hahn!0 = !{!1}
189