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