1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
2; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
3; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
4; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
5; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
6
7target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
8
9%struct.ident_t = type { i32, i32, i32, i32, i8* }
10
11@0 = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
12@1 = private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8
13@2 = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @0, i32 0, i32 0) }, align 8
14
15; %a is write only, %b is read only, neither is captured or freed, or ...
16; FIXME: %a and %b are *not* readnone!
17
18;.
19; CHECK: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [23 x i8] c"
20; CHECK: @[[GLOB1:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 514, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @[[GLOB0]], i32 0, i32 0) }, align 8
21; CHECK: @[[GLOB2:[0-9]+]] = private unnamed_addr constant [[STRUCT_IDENT_T:%.*]] { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @[[GLOB0]], i32 0, i32 0) }, align 8
22;.
23define dso_local void @func(float* nocapture %a, float* %b, i32 %N) local_unnamed_addr #0 {
24; IS__TUNIT_OPM: Function Attrs: nounwind uwtable
25; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@func
26; IS__TUNIT_OPM-SAME: (float* nocapture nofree writeonly [[A:%.*]], float* nocapture nofree readonly [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
27; IS__TUNIT_OPM-NEXT:  entry:
28; IS__TUNIT_OPM-NEXT:    [[A_ADDR:%.*]] = alloca float*, align 8
29; IS__TUNIT_OPM-NEXT:    [[B_ADDR:%.*]] = alloca float*, align 8
30; IS__TUNIT_OPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
31; IS__TUNIT_OPM-NEXT:    store float* [[A]], float** [[A_ADDR]], align 8
32; IS__TUNIT_OPM-NEXT:    store float* [[B]], float** [[B_ADDR]], align 8
33; IS__TUNIT_OPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef, float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]])
34; IS__TUNIT_OPM-NEXT:    ret void
35;
36; IS__TUNIT_NPM: Function Attrs: nounwind uwtable
37; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@func
38; IS__TUNIT_NPM-SAME: (float* nocapture nofree writeonly [[A:%.*]], float* nocapture nofree readonly [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
39; IS__TUNIT_NPM-NEXT:  entry:
40; IS__TUNIT_NPM-NEXT:    [[A_ADDR:%.*]] = alloca float*, align 8
41; IS__TUNIT_NPM-NEXT:    [[B_ADDR:%.*]] = alloca float*, align 8
42; IS__TUNIT_NPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
43; IS__TUNIT_NPM-NEXT:    store float* [[A]], float** [[A_ADDR]], align 8
44; IS__TUNIT_NPM-NEXT:    store float* [[B]], float** [[B_ADDR]], align 8
45; IS__TUNIT_NPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) undef, float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]])
46; IS__TUNIT_NPM-NEXT:    ret void
47;
48; IS__CGSCC____: Function Attrs: nounwind uwtable
49; IS__CGSCC____-LABEL: define {{[^@]+}}@func
50; IS__CGSCC____-SAME: (float* nocapture nofree [[A:%.*]], float* nofree [[B:%.*]], i32 [[N:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
51; IS__CGSCC____-NEXT:  entry:
52; IS__CGSCC____-NEXT:    [[A_ADDR:%.*]] = alloca float*, align 8
53; IS__CGSCC____-NEXT:    [[B_ADDR:%.*]] = alloca float*, align 8
54; IS__CGSCC____-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4
55; IS__CGSCC____-NEXT:    store float* [[A]], float** [[A_ADDR]], align 8
56; IS__CGSCC____-NEXT:    store float* [[B]], float** [[B_ADDR]], align 8
57; IS__CGSCC____-NEXT:    store i32 199, i32* [[N_ADDR]], align 4
58; IS__CGSCC____-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB2]], i32 noundef 3, void (i32*, i32*, ...)* noundef bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nofree noundef nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float** nofree noundef nonnull readonly align 8 dereferenceable(8) [[A_ADDR]], float** nofree noundef nonnull readonly align 8 dereferenceable(8) [[B_ADDR]])
59; IS__CGSCC____-NEXT:    ret void
60;
61entry:
62  %a.addr = alloca float*, align 8
63  %b.addr = alloca float*, align 8
64  %N.addr = alloca i32, align 4
65  store float* %a, float** %a.addr, align 8
66  store float* %b, float** %b.addr, align 8
67  store i32 199, i32* %N.addr, align 4
68  call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @2, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, float**, float**)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull %N.addr, float** nonnull %a.addr, float** nonnull %b.addr)
69  ret void
70}
71
72; FIXME: %N should not be loaded but 199 should be used.
73
74define internal void @.omp_outlined.(i32* noalias nocapture readonly %.global_tid., i32* noalias nocapture readnone %.bound_tid., i32* nocapture nonnull readonly align 4 dereferenceable(4) %N, float** nocapture nonnull readonly align 8 dereferenceable(8) %a, float** nocapture nonnull readonly align 8 dereferenceable(8) %b) #1 {
75; IS__TUNIT_OPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable
76; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@.omp_outlined.
77; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[N:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] {
78; IS__TUNIT_OPM-NEXT:  entry:
79; IS__TUNIT_OPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
80; IS__TUNIT_OPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
81; IS__TUNIT_OPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
82; IS__TUNIT_OPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
83; IS__TUNIT_OPM-NEXT:    br label [[OMP_PRECOND_THEN:%.*]]
84; IS__TUNIT_OPM:       omp.precond.then:
85; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
86; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]])
87; IS__TUNIT_OPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
88; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
89; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
90; IS__TUNIT_OPM-NEXT:    store i32 197, i32* [[DOTOMP_UB]], align 4
91; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
92; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
93; IS__TUNIT_OPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
94; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
95; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
96; IS__TUNIT_OPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
97; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
98; IS__TUNIT_OPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
99; IS__TUNIT_OPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
100; IS__TUNIT_OPM-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP5]], 197
101; IS__TUNIT_OPM-NEXT:    [[COND:%.*]] = select i1 [[CMP4]], i32 197, i32 [[TMP5]]
102; IS__TUNIT_OPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
103; IS__TUNIT_OPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
104; IS__TUNIT_OPM-NEXT:    [[CMP513:%.*]] = icmp sgt i32 [[TMP6]], [[COND]]
105; IS__TUNIT_OPM-NEXT:    br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]]
106; IS__TUNIT_OPM:       omp.inner.for.body.lr.ph:
107; IS__TUNIT_OPM-NEXT:    [[TMP7:%.*]] = load float*, float** [[B]], align 8
108; IS__TUNIT_OPM-NEXT:    [[TMP8:%.*]] = load float*, float** [[A]], align 8
109; IS__TUNIT_OPM-NEXT:    [[TMP9:%.*]] = sext i32 [[TMP6]] to i64
110; IS__TUNIT_OPM-NEXT:    [[TMP10:%.*]] = sext i32 [[COND]] to i64
111; IS__TUNIT_OPM-NEXT:    br label [[OMP_INNER_FOR_BODY:%.*]]
112; IS__TUNIT_OPM:       omp.inner.for.body:
113; IS__TUNIT_OPM-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP9]], [[OMP_INNER_FOR_BODY_LR_PH]] ]
114; IS__TUNIT_OPM-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
115; IS__TUNIT_OPM-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP7]], i64 [[INDVARS_IV_NEXT]]
116; IS__TUNIT_OPM-NEXT:    [[TMP11:%.*]] = load float, float* [[ARRAYIDX]], align 4
117; IS__TUNIT_OPM-NEXT:    [[CONV7:%.*]] = fadd float [[TMP11]], 1.000000e+00
118; IS__TUNIT_OPM-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]]
119; IS__TUNIT_OPM-NEXT:    store float [[CONV7]], float* [[ARRAYIDX9]], align 4
120; IS__TUNIT_OPM-NEXT:    [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP10]]
121; IS__TUNIT_OPM-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]]
122; IS__TUNIT_OPM:       omp.loop.exit:
123; IS__TUNIT_OPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]])
124; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
125; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
126; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
127; IS__TUNIT_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]])
128; IS__TUNIT_OPM-NEXT:    br label [[OMP_PRECOND_END:%.*]]
129; IS__TUNIT_OPM:       omp.precond.end:
130; IS__TUNIT_OPM-NEXT:    ret void
131;
132; IS__TUNIT_NPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable
133; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@.omp_outlined.
134; IS__TUNIT_NPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree nonnull readnone align 4 dereferenceable(4) [[N:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] {
135; IS__TUNIT_NPM-NEXT:  entry:
136; IS__TUNIT_NPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
137; IS__TUNIT_NPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
138; IS__TUNIT_NPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
139; IS__TUNIT_NPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
140; IS__TUNIT_NPM-NEXT:    br label [[OMP_PRECOND_THEN:%.*]]
141; IS__TUNIT_NPM:       omp.precond.then:
142; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
143; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]])
144; IS__TUNIT_NPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
145; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
146; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
147; IS__TUNIT_NPM-NEXT:    store i32 197, i32* [[DOTOMP_UB]], align 4
148; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
149; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
150; IS__TUNIT_NPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
151; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
152; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
153; IS__TUNIT_NPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
154; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
155; IS__TUNIT_NPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
156; IS__TUNIT_NPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
157; IS__TUNIT_NPM-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP5]], 197
158; IS__TUNIT_NPM-NEXT:    [[COND:%.*]] = select i1 [[CMP4]], i32 197, i32 [[TMP5]]
159; IS__TUNIT_NPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
160; IS__TUNIT_NPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
161; IS__TUNIT_NPM-NEXT:    [[CMP513:%.*]] = icmp sgt i32 [[TMP6]], [[COND]]
162; IS__TUNIT_NPM-NEXT:    br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]]
163; IS__TUNIT_NPM:       omp.inner.for.body.lr.ph:
164; IS__TUNIT_NPM-NEXT:    [[TMP7:%.*]] = load float*, float** [[B]], align 8
165; IS__TUNIT_NPM-NEXT:    [[TMP8:%.*]] = load float*, float** [[A]], align 8
166; IS__TUNIT_NPM-NEXT:    [[TMP9:%.*]] = sext i32 [[TMP6]] to i64
167; IS__TUNIT_NPM-NEXT:    [[TMP10:%.*]] = sext i32 [[COND]] to i64
168; IS__TUNIT_NPM-NEXT:    br label [[OMP_INNER_FOR_BODY:%.*]]
169; IS__TUNIT_NPM:       omp.inner.for.body:
170; IS__TUNIT_NPM-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP9]], [[OMP_INNER_FOR_BODY_LR_PH]] ]
171; IS__TUNIT_NPM-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
172; IS__TUNIT_NPM-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP7]], i64 [[INDVARS_IV_NEXT]]
173; IS__TUNIT_NPM-NEXT:    [[TMP11:%.*]] = load float, float* [[ARRAYIDX]], align 4
174; IS__TUNIT_NPM-NEXT:    [[CONV7:%.*]] = fadd float [[TMP11]], 1.000000e+00
175; IS__TUNIT_NPM-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]]
176; IS__TUNIT_NPM-NEXT:    store float [[CONV7]], float* [[ARRAYIDX9]], align 4
177; IS__TUNIT_NPM-NEXT:    [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP10]]
178; IS__TUNIT_NPM-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]]
179; IS__TUNIT_NPM:       omp.loop.exit:
180; IS__TUNIT_NPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP4]])
181; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
182; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
183; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
184; IS__TUNIT_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP0]])
185; IS__TUNIT_NPM-NEXT:    br label [[OMP_PRECOND_END:%.*]]
186; IS__TUNIT_NPM:       omp.precond.end:
187; IS__TUNIT_NPM-NEXT:    ret void
188;
189; IS__CGSCC_OPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable
190; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@.omp_outlined.
191; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] {
192; IS__CGSCC_OPM-NEXT:  entry:
193; IS__CGSCC_OPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
194; IS__CGSCC_OPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
195; IS__CGSCC_OPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
196; IS__CGSCC_OPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
197; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
198; IS__CGSCC_OPM-NEXT:    [[SUB2:%.*]] = add nsw i32 [[TMP0]], -2
199; IS__CGSCC_OPM-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP0]], 1
200; IS__CGSCC_OPM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
201; IS__CGSCC_OPM:       omp.precond.then:
202; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
203; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
204; IS__CGSCC_OPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
205; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
206; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
207; IS__CGSCC_OPM-NEXT:    store i32 [[SUB2]], i32* [[DOTOMP_UB]], align 4
208; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
209; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
210; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
211; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
212; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]])
213; IS__CGSCC_OPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
214; IS__CGSCC_OPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
215; IS__CGSCC_OPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
216; IS__CGSCC_OPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
217; IS__CGSCC_OPM-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP6]], [[SUB2]]
218; IS__CGSCC_OPM-NEXT:    [[COND:%.*]] = select i1 [[CMP4]], i32 [[SUB2]], i32 [[TMP6]]
219; IS__CGSCC_OPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
220; IS__CGSCC_OPM-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
221; IS__CGSCC_OPM-NEXT:    [[CMP513:%.*]] = icmp sgt i32 [[TMP7]], [[COND]]
222; IS__CGSCC_OPM-NEXT:    br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]]
223; IS__CGSCC_OPM:       omp.inner.for.body.lr.ph:
224; IS__CGSCC_OPM-NEXT:    [[TMP8:%.*]] = load float*, float** [[B]], align 8
225; IS__CGSCC_OPM-NEXT:    [[TMP9:%.*]] = load float*, float** [[A]], align 8
226; IS__CGSCC_OPM-NEXT:    [[TMP10:%.*]] = sext i32 [[TMP7]] to i64
227; IS__CGSCC_OPM-NEXT:    [[TMP11:%.*]] = sext i32 [[COND]] to i64
228; IS__CGSCC_OPM-NEXT:    br label [[OMP_INNER_FOR_BODY:%.*]]
229; IS__CGSCC_OPM:       omp.inner.for.body:
230; IS__CGSCC_OPM-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP10]], [[OMP_INNER_FOR_BODY_LR_PH]] ]
231; IS__CGSCC_OPM-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
232; IS__CGSCC_OPM-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]]
233; IS__CGSCC_OPM-NEXT:    [[TMP12:%.*]] = load float, float* [[ARRAYIDX]], align 4
234; IS__CGSCC_OPM-NEXT:    [[CONV7:%.*]] = fadd float [[TMP12]], 1.000000e+00
235; IS__CGSCC_OPM-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP9]], i64 [[INDVARS_IV_NEXT]]
236; IS__CGSCC_OPM-NEXT:    store float [[CONV7]], float* [[ARRAYIDX9]], align 4
237; IS__CGSCC_OPM-NEXT:    [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP11]]
238; IS__CGSCC_OPM-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]]
239; IS__CGSCC_OPM:       omp.loop.exit:
240; IS__CGSCC_OPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]])
241; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]])
242; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
243; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
244; IS__CGSCC_OPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
245; IS__CGSCC_OPM-NEXT:    br label [[OMP_PRECOND_END]]
246; IS__CGSCC_OPM:       omp.precond.end:
247; IS__CGSCC_OPM-NEXT:    ret void
248;
249; IS__CGSCC_NPM: Function Attrs: alwaysinline nofree norecurse nounwind uwtable
250; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@.omp_outlined.
251; IS__CGSCC_NPM-SAME: (i32* noalias nocapture nofree readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[A:%.*]], float** noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR1:[0-9]+]] {
252; IS__CGSCC_NPM-NEXT:  entry:
253; IS__CGSCC_NPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4
254; IS__CGSCC_NPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4
255; IS__CGSCC_NPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
256; IS__CGSCC_NPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
257; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[N]], align 4
258; IS__CGSCC_NPM-NEXT:    [[SUB2:%.*]] = add nsw i32 [[TMP0]], -2
259; IS__CGSCC_NPM-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP0]], 1
260; IS__CGSCC_NPM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
261; IS__CGSCC_NPM:       omp.precond.then:
262; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = bitcast i32* [[DOTOMP_LB]] to i8*
263; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
264; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4
265; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = bitcast i32* [[DOTOMP_UB]] to i8*
266; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
267; IS__CGSCC_NPM-NEXT:    store i32 [[SUB2]], i32* [[DOTOMP_UB]], align 4
268; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast i32* [[DOTOMP_STRIDE]] to i8*
269; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
270; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4
271; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = bitcast i32* [[DOTOMP_IS_LAST]] to i8*
272; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]])
273; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
274; IS__CGSCC_NPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
275; IS__CGSCC_NPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
276; IS__CGSCC_NPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
277; IS__CGSCC_NPM-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[TMP6]], [[SUB2]]
278; IS__CGSCC_NPM-NEXT:    [[COND:%.*]] = select i1 [[CMP4]], i32 [[SUB2]], i32 [[TMP6]]
279; IS__CGSCC_NPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
280; IS__CGSCC_NPM-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
281; IS__CGSCC_NPM-NEXT:    [[CMP513:%.*]] = icmp sgt i32 [[TMP7]], [[COND]]
282; IS__CGSCC_NPM-NEXT:    br i1 [[CMP513]], label [[OMP_LOOP_EXIT:%.*]], label [[OMP_INNER_FOR_BODY_LR_PH:%.*]]
283; IS__CGSCC_NPM:       omp.inner.for.body.lr.ph:
284; IS__CGSCC_NPM-NEXT:    [[TMP8:%.*]] = load float*, float** [[B]], align 8
285; IS__CGSCC_NPM-NEXT:    [[TMP9:%.*]] = load float*, float** [[A]], align 8
286; IS__CGSCC_NPM-NEXT:    [[TMP10:%.*]] = sext i32 [[TMP7]] to i64
287; IS__CGSCC_NPM-NEXT:    [[TMP11:%.*]] = sext i32 [[COND]] to i64
288; IS__CGSCC_NPM-NEXT:    br label [[OMP_INNER_FOR_BODY:%.*]]
289; IS__CGSCC_NPM:       omp.inner.for.body:
290; IS__CGSCC_NPM-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[OMP_INNER_FOR_BODY]] ], [ [[TMP10]], [[OMP_INNER_FOR_BODY_LR_PH]] ]
291; IS__CGSCC_NPM-NEXT:    [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
292; IS__CGSCC_NPM-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP8]], i64 [[INDVARS_IV_NEXT]]
293; IS__CGSCC_NPM-NEXT:    [[TMP12:%.*]] = load float, float* [[ARRAYIDX]], align 4
294; IS__CGSCC_NPM-NEXT:    [[CONV7:%.*]] = fadd float [[TMP12]], 1.000000e+00
295; IS__CGSCC_NPM-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds float, float* [[TMP9]], i64 [[INDVARS_IV_NEXT]]
296; IS__CGSCC_NPM-NEXT:    store float [[CONV7]], float* [[ARRAYIDX9]], align 4
297; IS__CGSCC_NPM-NEXT:    [[CMP5:%.*]] = icmp slt i64 [[INDVARS_IV]], [[TMP11]]
298; IS__CGSCC_NPM-NEXT:    br i1 [[CMP5]], label [[OMP_INNER_FOR_BODY]], label [[OMP_LOOP_EXIT]]
299; IS__CGSCC_NPM:       omp.loop.exit:
300; IS__CGSCC_NPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) @[[GLOB1]], i32 [[TMP5]])
301; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP4]])
302; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP3]])
303; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP2]])
304; IS__CGSCC_NPM-NEXT:    call void @llvm.lifetime.end.p0i8(i64 noundef 4, i8* nocapture nofree noundef nonnull align 4 dereferenceable(4) [[TMP1]])
305; IS__CGSCC_NPM-NEXT:    br label [[OMP_PRECOND_END]]
306; IS__CGSCC_NPM:       omp.precond.end:
307; IS__CGSCC_NPM-NEXT:    ret void
308;
309entry:
310  %.omp.lb = alloca i32, align 4
311  %.omp.ub = alloca i32, align 4
312  %.omp.stride = alloca i32, align 4
313  %.omp.is_last = alloca i32, align 4
314  %0 = load i32, i32* %N, align 4
315  %sub2 = add nsw i32 %0, -2
316  %cmp = icmp sgt i32 %0, 1
317  br i1 %cmp, label %omp.precond.then, label %omp.precond.end
318
319omp.precond.then:                                 ; preds = %entry
320  %1 = bitcast i32* %.omp.lb to i8*
321  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %1) #3
322  store i32 0, i32* %.omp.lb, align 4
323  %2 = bitcast i32* %.omp.ub to i8*
324  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %2) #3
325  store i32 %sub2, i32* %.omp.ub, align 4
326  %3 = bitcast i32* %.omp.stride to i8*
327  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #3
328  store i32 1, i32* %.omp.stride, align 4
329  %4 = bitcast i32* %.omp.is_last to i8*
330  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %4) #3
331  store i32 0, i32* %.omp.is_last, align 4
332  %5 = load i32, i32* %.global_tid., align 4
333  call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @1, i32 %5, i32 34, i32* nonnull %.omp.is_last, i32* nonnull %.omp.lb, i32* nonnull %.omp.ub, i32* nonnull %.omp.stride, i32 1, i32 1) #3
334  %6 = load i32, i32* %.omp.ub, align 4
335  %cmp4 = icmp sgt i32 %6, %sub2
336  %cond = select i1 %cmp4, i32 %sub2, i32 %6
337  store i32 %cond, i32* %.omp.ub, align 4
338  %7 = load i32, i32* %.omp.lb, align 4
339  %cmp513 = icmp sgt i32 %7, %cond
340  br i1 %cmp513, label %omp.loop.exit, label %omp.inner.for.body.lr.ph
341
342omp.inner.for.body.lr.ph:                         ; preds = %omp.precond.then
343  %8 = load float*, float** %b, align 8
344  %9 = load float*, float** %a, align 8
345  %10 = sext i32 %7 to i64
346  %11 = sext i32 %cond to i64
347  br label %omp.inner.for.body
348
349omp.inner.for.body:                               ; preds = %omp.inner.for.body, %omp.inner.for.body.lr.ph
350  %indvars.iv = phi i64 [ %indvars.iv.next, %omp.inner.for.body ], [ %10, %omp.inner.for.body.lr.ph ]
351  %indvars.iv.next = add nsw i64 %indvars.iv, 1
352  %arrayidx = getelementptr inbounds float, float* %8, i64 %indvars.iv.next
353  %12 = load float, float* %arrayidx, align 4
354  %conv7 = fadd float %12, 1.000000e+00
355  %arrayidx9 = getelementptr inbounds float, float* %9, i64 %indvars.iv.next
356  store float %conv7, float* %arrayidx9, align 4
357  %cmp5 = icmp slt i64 %indvars.iv, %11
358  br i1 %cmp5, label %omp.inner.for.body, label %omp.loop.exit
359
360omp.loop.exit:                                    ; preds = %omp.inner.for.body, %omp.precond.then
361  call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @1, i32 %5)
362  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %4) #3
363  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %3) #3
364  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %2) #3
365  call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %1) #3
366  br label %omp.precond.end
367
368omp.precond.end:                                  ; preds = %omp.loop.exit, %entry
369  ret void
370}
371
372; Function Attrs: argmemonly nounwind willreturn
373declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #2
374
375; Function Attrs: argmemonly nounwind willreturn
376declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #2
377
378declare dso_local void @__kmpc_for_static_init_4(%struct.ident_t*, i32, i32, i32*, i32*, i32*, i32*, i32, i32) local_unnamed_addr
379
380; Function Attrs: nounwind
381declare void @__kmpc_for_static_fini(%struct.ident_t*, i32) local_unnamed_addr #3
382
383; Function Attrs: nounwind
384declare !callback !1 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) local_unnamed_addr #3
385
386attributes #0 = { nounwind uwtable }
387attributes #1 = { alwaysinline nofree norecurse nounwind uwtable }
388attributes #2 = { nounwind }
389
390!llvm.module.flags = !{!0}
391
392!0 = !{i32 7, !"openmp", i32 50}
393!1 = !{!2}
394!2 = !{i64 2, i64 -1, i64 -1, i1 true}
395;.
396; CHECK: attributes #[[ATTR0:[0-9]+]] = { nounwind uwtable }
397; CHECK: attributes #[[ATTR1:[0-9]+]] = { alwaysinline nofree norecurse nounwind uwtable }
398; CHECK: attributes #[[ATTR2:[0-9]+]] = { argmemonly nocallback nofree nosync nounwind willreturn }
399;.
400; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50}
401; CHECK: [[META1:![0-9]+]] = !{!2}
402; CHECK: [[META2:![0-9]+]] = !{i64 2, i64 -1, i64 -1, i1 true}
403;.
404