brintos

brintos / llvm-project-archived public Read only

0
0
Text · 57.6 KiB · 929fb29 Raw
1301 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -aa-pipeline='basic-aa,scoped-noalias-aa' -passes=slp-vectorizer -mtriple=arm64-apple-darwin -S %s | FileCheck %s3 4define void @needs_versioning_not_profitable(ptr %dst, ptr %src) {5; CHECK-LABEL: @needs_versioning_not_profitable(6; CHECK-NEXT:  entry:7; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 48; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 169; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 410; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 111; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 412; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 1613; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 114; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 415; CHECK-NEXT:    ret void16;17entry:18  %src.0 = load i32, ptr %src, align 419  %r.0 = ashr i32 %src.0, 1620  store i32 %r.0, ptr %dst, align 421  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 122  %src.1 = load i32, ptr %src.gep.1, align 423  %r.1 = ashr i32 %src.1, 1624  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 125  store i32 %r.1, ptr %dst.gep.1, align 426  ret void27}28 29define void @needs_versioning_profitable(ptr %dst, ptr %src) {30; CHECK-LABEL: @needs_versioning_profitable(31; CHECK-NEXT:  entry:32; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 433; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 1634; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 435; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 136; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 437; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 1638; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 139; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 440; CHECK-NEXT:    [[SRC_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 241; CHECK-NEXT:    [[SRC_2:%.*]] = load i32, ptr [[SRC_GEP_2]], align 442; CHECK-NEXT:    [[R_2:%.*]] = ashr i32 [[SRC_2]], 1643; CHECK-NEXT:    [[DST_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 244; CHECK-NEXT:    store i32 [[R_2]], ptr [[DST_GEP_2]], align 445; CHECK-NEXT:    [[SRC_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 346; CHECK-NEXT:    [[SRC_3:%.*]] = load i32, ptr [[SRC_GEP_3]], align 447; CHECK-NEXT:    [[R_3:%.*]] = ashr i32 [[SRC_3]], 1648; CHECK-NEXT:    [[DST_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 349; CHECK-NEXT:    store i32 [[R_3]], ptr [[DST_GEP_3]], align 450; CHECK-NEXT:    ret void51;52entry:53  %src.0 = load i32, ptr %src, align 454  %r.0 = ashr i32 %src.0, 1655  store i32 %r.0, ptr %dst, align 456  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 157  %src.1 = load i32, ptr %src.gep.1, align 458  %r.1 = ashr i32 %src.1, 1659  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 160  store i32 %r.1, ptr %dst.gep.1, align 461  %src.gep.2 = getelementptr inbounds i32, ptr %src, i64 262  %src.2 = load i32, ptr %src.gep.2, align 463  %r.2 = ashr i32 %src.2, 1664  %dst.gep.2 = getelementptr inbounds i32, ptr %dst, i64 265  store i32 %r.2, ptr %dst.gep.2, align 466  %src.gep.3 = getelementptr inbounds i32, ptr %src, i64 367  %src.3 = load i32, ptr %src.gep.3, align 468  %r.3 = ashr i32 %src.3, 1669  %dst.gep.3 = getelementptr inbounds i32, ptr %dst, i64 370  store i32 %r.3, ptr %dst.gep.3, align 471 72  ret void73}74 75define void @needs_versioning_profitable_2_sources(ptr %dst, ptr %A, ptr %B) {76; CHECK-LABEL: @needs_versioning_profitable_2_sources(77; CHECK-NEXT:  entry:78; CHECK-NEXT:    [[A_0:%.*]] = load i32, ptr [[A:%.*]], align 479; CHECK-NEXT:    [[B_0:%.*]] = load i32, ptr [[B:%.*]], align 480; CHECK-NEXT:    [[R_0:%.*]] = add i32 [[A_0]], [[B_0]]81; CHECK-NEXT:    [[MUL_0:%.*]] = mul i32 [[R_0]], 282; CHECK-NEXT:    store i32 [[MUL_0]], ptr [[DST:%.*]], align 483; CHECK-NEXT:    [[A_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 184; CHECK-NEXT:    [[A_1:%.*]] = load i32, ptr [[A_GEP_1]], align 485; CHECK-NEXT:    [[B_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 186; CHECK-NEXT:    [[B_1:%.*]] = load i32, ptr [[B_GEP_1]], align 487; CHECK-NEXT:    [[R_1:%.*]] = add i32 [[A_1]], [[B_1]]88; CHECK-NEXT:    [[MUL_1:%.*]] = mul i32 [[R_1]], 289; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 190; CHECK-NEXT:    store i32 [[MUL_1]], ptr [[DST_GEP_1]], align 491; CHECK-NEXT:    [[A_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 292; CHECK-NEXT:    [[A_2:%.*]] = load i32, ptr [[A_GEP_2]], align 493; CHECK-NEXT:    [[B_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 294; CHECK-NEXT:    [[B_2:%.*]] = load i32, ptr [[B_GEP_2]], align 495; CHECK-NEXT:    [[R_2:%.*]] = add i32 [[A_2]], [[B_2]]96; CHECK-NEXT:    [[MUL_2:%.*]] = mul i32 [[R_2]], 297; CHECK-NEXT:    [[DST_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 298; CHECK-NEXT:    store i32 [[MUL_2]], ptr [[DST_GEP_2]], align 499; CHECK-NEXT:    [[A_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 3100; CHECK-NEXT:    [[A_3:%.*]] = load i32, ptr [[A_GEP_3]], align 4101; CHECK-NEXT:    [[B_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 3102; CHECK-NEXT:    [[B_3:%.*]] = load i32, ptr [[B_GEP_3]], align 4103; CHECK-NEXT:    [[R_3:%.*]] = add i32 [[A_3]], [[B_3]]104; CHECK-NEXT:    [[MUL_3:%.*]] = mul i32 [[R_3]], 2105; CHECK-NEXT:    [[DST_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3106; CHECK-NEXT:    store i32 [[MUL_3]], ptr [[DST_GEP_3]], align 4107; CHECK-NEXT:    ret void108;109entry:110  %A.0 = load i32, ptr %A, align 4111  %B.0 = load i32, ptr %B, align 4112  %r.0 = add i32 %A.0, %B.0113  %mul.0 = mul i32 %r.0, 2114  store i32 %mul.0, ptr %dst, align 4115  %A.gep.1 = getelementptr inbounds i32, ptr %A, i64 1116  %A.1 = load i32, ptr %A.gep.1, align 4117  %B.gep.1 = getelementptr inbounds i32, ptr %B, i64 1118  %B.1 = load i32, ptr %B.gep.1, align 4119  %r.1 = add i32 %A.1, %B.1120  %mul.1 = mul i32 %r.1, 2121  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1122  store i32 %mul.1, ptr %dst.gep.1, align 4123  %A.gep.2 = getelementptr inbounds i32, ptr %A, i64 2124  %A.2 = load i32, ptr %A.gep.2, align 4125  %B.gep.2 = getelementptr inbounds i32, ptr %B, i64 2126  %B.2 = load i32, ptr %B.gep.2, align 4127  %r.2 = add i32 %A.2, %B.2128  %mul.2 = mul i32 %r.2, 2129  %dst.gep.2 = getelementptr inbounds i32, ptr %dst, i64 2130  store i32 %mul.2, ptr %dst.gep.2, align 4131  %A.gep.3 = getelementptr inbounds i32, ptr %A, i64 3132  %A.3 = load i32, ptr %A.gep.3, align 4133  %B.gep.3 = getelementptr inbounds i32, ptr %B, i64 3134  %B.3 = load i32, ptr %B.gep.3, align 4135  %r.3 = add i32 %A.3, %B.3136  %mul.3 = mul i32 %r.3, 2137  %dst.gep.3 = getelementptr inbounds i32, ptr %dst, i64 3138  store i32 %mul.3, ptr %dst.gep.3, align 4139 140  ret void141}142 143declare void @use(i32)144 145declare void @bar()146 147define void @needs_versioning_profitable_split_points(ptr %dst, ptr %src) {148; CHECK-LABEL: @needs_versioning_profitable_split_points(149; CHECK-NEXT:  entry:150; CHECK-NEXT:    call void @bar()151; CHECK-NEXT:    call void @bar()152; CHECK-NEXT:    call void @bar()153; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4154; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16155; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4156; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1157; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4158; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16159; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1160; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4161; CHECK-NEXT:    [[SRC_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2162; CHECK-NEXT:    [[SRC_2:%.*]] = load i32, ptr [[SRC_GEP_2]], align 4163; CHECK-NEXT:    [[R_2:%.*]] = ashr i32 [[SRC_2]], 16164; CHECK-NEXT:    [[DST_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2165; CHECK-NEXT:    store i32 [[R_2]], ptr [[DST_GEP_2]], align 4166; CHECK-NEXT:    [[SRC_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3167; CHECK-NEXT:    [[SRC_3:%.*]] = load i32, ptr [[SRC_GEP_3]], align 4168; CHECK-NEXT:    [[R_3:%.*]] = ashr i32 [[SRC_3]], 16169; CHECK-NEXT:    [[DST_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3170; CHECK-NEXT:    store i32 [[R_3]], ptr [[DST_GEP_3]], align 4171; CHECK-NEXT:    call void @bar()172; CHECK-NEXT:    ret void173;174entry:175  call void @bar()176  call void @bar()177  call void @bar()178 179  %src.0 = load i32, ptr %src, align 4180  %r.0 = ashr i32 %src.0, 16181  store i32 %r.0, ptr %dst, align 4182  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1183  %src.1 = load i32, ptr %src.gep.1, align 4184  %r.1 = ashr i32 %src.1, 16185  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1186  store i32 %r.1, ptr %dst.gep.1, align 4187  %src.gep.2 = getelementptr inbounds i32, ptr %src, i64 2188  %src.2 = load i32, ptr %src.gep.2, align 4189  %r.2 = ashr i32 %src.2, 16190  %dst.gep.2 = getelementptr inbounds i32, ptr %dst, i64 2191  store i32 %r.2, ptr %dst.gep.2, align 4192  %src.gep.3 = getelementptr inbounds i32, ptr %src, i64 3193  %src.3 = load i32, ptr %src.gep.3, align 4194  %r.3 = ashr i32 %src.3, 16195  %dst.gep.3 = getelementptr inbounds i32, ptr %dst, i64 3196  store i32 %r.3, ptr %dst.gep.3, align 4197 198  call void @bar()199  ret void200}201 202define void @needs_versioning_profitable_load_used_outside_region1(ptr %dst, ptr %src, i1 %c) {203; CHECK-LABEL: @needs_versioning_profitable_load_used_outside_region1(204; CHECK-NEXT:  entry:205; CHECK-NEXT:    br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]206; CHECK:       then:207; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4208; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16209; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4210; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1211; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4212; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16213; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1214; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4215; CHECK-NEXT:    [[SRC_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2216; CHECK-NEXT:    [[SRC_2:%.*]] = load i32, ptr [[SRC_GEP_2]], align 4217; CHECK-NEXT:    [[R_2:%.*]] = ashr i32 [[SRC_2]], 16218; CHECK-NEXT:    [[DST_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2219; CHECK-NEXT:    store i32 [[R_2]], ptr [[DST_GEP_2]], align 4220; CHECK-NEXT:    [[SRC_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3221; CHECK-NEXT:    [[SRC_3:%.*]] = load i32, ptr [[SRC_GEP_3]], align 4222; CHECK-NEXT:    [[R_3:%.*]] = ashr i32 [[SRC_3]], 16223; CHECK-NEXT:    [[DST_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3224; CHECK-NEXT:    store i32 [[R_3]], ptr [[DST_GEP_3]], align 4225; CHECK-NEXT:    [[SRC_GEP_5:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 5226; CHECK-NEXT:    [[L:%.*]] = load i32, ptr [[SRC_GEP_5]], align 4227; CHECK-NEXT:    call void @use(i32 [[L]])228; CHECK-NEXT:    br label [[EXIT]]229; CHECK:       exit:230; CHECK-NEXT:    ret void231;232entry:233  br i1 %c, label %then, label %exit234 235then:236  %src.0 = load i32, ptr %src, align 4237  %r.0 = ashr i32 %src.0, 16238  store i32 %r.0, ptr %dst, align 4239  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1240  %src.1 = load i32, ptr %src.gep.1, align 4241  %r.1 = ashr i32 %src.1, 16242  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1243  store i32 %r.1, ptr %dst.gep.1, align 4244  %src.gep.2 = getelementptr inbounds i32, ptr %src, i64 2245  %src.2 = load i32, ptr %src.gep.2, align 4246  %r.2 = ashr i32 %src.2, 16247  %dst.gep.2 = getelementptr inbounds i32, ptr %dst, i64 2248  store i32 %r.2, ptr %dst.gep.2, align 4249  %src.gep.3 = getelementptr inbounds i32, ptr %src, i64 3250  %src.3 = load i32, ptr %src.gep.3, align 4251  %r.3 = ashr i32 %src.3, 16252  %dst.gep.3 = getelementptr inbounds i32, ptr %dst, i64 3253  store i32 %r.3, ptr %dst.gep.3, align 4254  %src.gep.5 = getelementptr inbounds i32, ptr %src, i64 5255  %l = load i32, ptr %src.gep.5256  call void @use(i32 %l)257  br label %exit258 259exit:260  ret void261}262 263define void @needs_versioning_profitable_load_used_outside_region2(ptr %dst, ptr %src, i1 %c) {264; CHECK-LABEL: @needs_versioning_profitable_load_used_outside_region2(265; CHECK-NEXT:  entry:266; CHECK-NEXT:    br i1 [[C:%.*]], label [[THEN:%.*]], label [[EXIT:%.*]]267; CHECK:       then:268; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4269; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16270; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4271; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1272; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4273; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16274; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1275; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4276; CHECK-NEXT:    [[SRC_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 2277; CHECK-NEXT:    [[SRC_2:%.*]] = load i32, ptr [[SRC_GEP_2]], align 4278; CHECK-NEXT:    [[SRC_GEP_5:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 5279; CHECK-NEXT:    [[L:%.*]] = load i32, ptr [[SRC_GEP_5]], align 4280; CHECK-NEXT:    [[R_2:%.*]] = ashr i32 [[SRC_2]], 16281; CHECK-NEXT:    [[DST_GEP_2:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 2282; CHECK-NEXT:    store i32 [[R_2]], ptr [[DST_GEP_2]], align 4283; CHECK-NEXT:    [[SRC_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 3284; CHECK-NEXT:    [[SRC_3:%.*]] = load i32, ptr [[SRC_GEP_3]], align 4285; CHECK-NEXT:    [[R_3:%.*]] = ashr i32 [[SRC_3]], 16286; CHECK-NEXT:    [[DST_GEP_3:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 3287; CHECK-NEXT:    store i32 [[R_3]], ptr [[DST_GEP_3]], align 4288; CHECK-NEXT:    call void @use(i32 [[L]])289; CHECK-NEXT:    br label [[EXIT]]290; CHECK:       exit:291; CHECK-NEXT:    ret void292;293entry:294  br i1 %c, label %then, label %exit295 296then:297  %src.0 = load i32, ptr %src, align 4298  %r.0 = ashr i32 %src.0, 16299  store i32 %r.0, ptr %dst, align 4300  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1301  %src.1 = load i32, ptr %src.gep.1, align 4302  %r.1 = ashr i32 %src.1, 16303  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1304  store i32 %r.1, ptr %dst.gep.1, align 4305  %src.gep.2 = getelementptr inbounds i32, ptr %src, i64 2306  %src.2 = load i32, ptr %src.gep.2, align 4307  %src.gep.5 = getelementptr inbounds i32, ptr %src, i64 5308  %l = load i32, ptr %src.gep.5309  %r.2 = ashr i32 %src.2, 16310  %dst.gep.2 = getelementptr inbounds i32, ptr %dst, i64 2311  store i32 %r.2, ptr %dst.gep.2, align 4312  %src.gep.3 = getelementptr inbounds i32, ptr %src, i64 3313  %src.3 = load i32, ptr %src.gep.3, align 4314  %r.3 = ashr i32 %src.3, 16315  %dst.gep.3 = getelementptr inbounds i32, ptr %dst, i64 3316  store i32 %r.3, ptr %dst.gep.3, align 4317  call void @use(i32 %l)318  br label %exit319 320exit:321  ret void322}323 324define void @no_version(ptr nocapture %dst, ptr nocapture readonly %src) {325; CHECK-LABEL: @no_version(326; CHECK-NEXT:  entry:327; CHECK-NEXT:    [[TMP0:%.*]] = load <2 x i32>, ptr [[SRC:%.*]], align 4328; CHECK-NEXT:    [[TMP1:%.*]] = ashr <2 x i32> [[TMP0]], splat (i32 16)329; CHECK-NEXT:    store <2 x i32> [[TMP1]], ptr [[DST:%.*]], align 4330; CHECK-NEXT:    ret void331;332entry:333  %src.0 = load i32, ptr %src, align 4334  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1335  %src.1 = load i32, ptr %src.gep.1, align 4336  %r.0 = ashr i32 %src.0, 16337  %r.1 = ashr i32 %src.1, 16338  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1339  store i32 %r.0, ptr %dst, align 4340  store i32 %r.1, ptr %dst.gep.1, align 4341  ret void342}343 344define void @version_multiple(ptr nocapture %out_block, ptr nocapture readonly %counter) {345; CHECK-LABEL: @version_multiple(346; CHECK-NEXT:  entry:347; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[COUNTER:%.*]], align 4348; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[OUT_BLOCK:%.*]], align 4349; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[TMP1]], [[TMP0]]350; CHECK-NEXT:    store i32 [[XOR]], ptr [[OUT_BLOCK]], align 4351; CHECK-NEXT:    [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[COUNTER]], i64 1352; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4353; CHECK-NEXT:    [[ARRAYIDX2_1:%.*]] = getelementptr inbounds i32, ptr [[OUT_BLOCK]], i64 1354; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX2_1]], align 4355; CHECK-NEXT:    [[XOR_1:%.*]] = xor i32 [[TMP3]], [[TMP2]]356; CHECK-NEXT:    store i32 [[XOR_1]], ptr [[ARRAYIDX2_1]], align 4357; CHECK-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[COUNTER]], i64 2358; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4359; CHECK-NEXT:    [[ARRAYIDX2_2:%.*]] = getelementptr inbounds i32, ptr [[OUT_BLOCK]], i64 2360; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX2_2]], align 4361; CHECK-NEXT:    [[XOR_2:%.*]] = xor i32 [[TMP5]], [[TMP4]]362; CHECK-NEXT:    store i32 [[XOR_2]], ptr [[ARRAYIDX2_2]], align 4363; CHECK-NEXT:    [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[COUNTER]], i64 3364; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4365; CHECK-NEXT:    [[ARRAYIDX2_3:%.*]] = getelementptr inbounds i32, ptr [[OUT_BLOCK]], i64 3366; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX2_3]], align 4367; CHECK-NEXT:    [[XOR_3:%.*]] = xor i32 [[TMP7]], [[TMP6]]368; CHECK-NEXT:    store i32 [[XOR_3]], ptr [[ARRAYIDX2_3]], align 4369; CHECK-NEXT:    ret void370;371entry:372  %0 = load i32, ptr %counter, align 4373  %1 = load i32, ptr %out_block, align 4374  %xor = xor i32 %1, %0375  store i32 %xor, ptr %out_block, align 4376  %arrayidx.1 = getelementptr inbounds i32, ptr %counter, i64 1377  %2 = load i32, ptr %arrayidx.1, align 4378  %arrayidx2.1 = getelementptr inbounds i32, ptr %out_block, i64 1379  %3 = load i32, ptr %arrayidx2.1, align 4380  %xor.1 = xor i32 %3, %2381  store i32 %xor.1, ptr %arrayidx2.1, align 4382  %arrayidx.2 = getelementptr inbounds i32, ptr %counter, i64 2383  %4 = load i32, ptr %arrayidx.2, align 4384  %arrayidx2.2 = getelementptr inbounds i32, ptr %out_block, i64 2385  %5 = load i32, ptr %arrayidx2.2, align 4386  %xor.2 = xor i32 %5, %4387  store i32 %xor.2, ptr %arrayidx2.2, align 4388  %arrayidx.3 = getelementptr inbounds i32, ptr %counter, i64 3389  %6 = load i32, ptr %arrayidx.3, align 4390  %arrayidx2.3 = getelementptr inbounds i32, ptr %out_block, i64 3391  %7 = load i32, ptr %arrayidx2.3, align 4392  %xor.3 = xor i32 %7, %6393  store i32 %xor.3, ptr %arrayidx2.3, align 4394  ret void395}396 397define i32 @use_outside_version_bb(ptr %dst, ptr %src, i1 %c.1) {398; CHECK-LABEL: @use_outside_version_bb(399; CHECK-NEXT:  entry:400; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4401; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16402; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4403; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1404; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4405; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16406; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1407; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4408; CHECK-NEXT:    br label [[EXIT:%.*]]409; CHECK:       exit:410; CHECK-NEXT:    ret i32 [[R_0]]411;412entry:413  %src.0 = load i32, ptr %src, align 4414  %r.0 = ashr i32 %src.0, 16415  store i32 %r.0, ptr %dst, align 4416  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1417  %src.1 = load i32, ptr %src.gep.1, align 4418  %r.1 = ashr i32 %src.1, 16419  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1420  store i32 %r.1, ptr %dst.gep.1, align 4421  br label %exit422 423exit:424  ret i32 %r.0425}426 427define i32 @value_used_in_return(ptr %dst, ptr %src, i32 %x) {428; CHECK-LABEL: @value_used_in_return(429; CHECK-NEXT:  entry:430; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4431; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16432; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4433; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1434; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4435; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16436; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1437; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4438; CHECK-NEXT:    [[ADD:%.*]] = add i32 [[X:%.*]], 20439; CHECK-NEXT:    ret i32 [[ADD]]440;441entry:442  %src.0 = load i32, ptr %src, align 4443  %r.0 = ashr i32 %src.0, 16444  store i32 %r.0, ptr %dst, align 4445  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1446  %src.1 = load i32, ptr %src.gep.1, align 4447  %r.1 = ashr i32 %src.1, 16448  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1449  store i32 %r.1, ptr %dst.gep.1, align 4450  %add = add i32 %x, 20451  ret i32 %add452}453define i32 @needs_versioning2_cond_br(ptr %dst, ptr %src, i1 %c.1) {454; CHECK-LABEL: @needs_versioning2_cond_br(455; CHECK-NEXT:  entry:456; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]457; CHECK:       then:458; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC:%.*]], align 4459; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16460; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4461; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1462; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4463; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16464; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1465; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4466; CHECK-NEXT:    ret i32 10467; CHECK:       else:468; CHECK-NEXT:    ret i32 0469;470entry:471  br i1 %c.1, label %then, label %else472 473then:474  %src.0 = load i32, ptr %src, align 4475  %r.0 = ashr i32 %src.0, 16476  store i32 %r.0, ptr %dst, align 4477  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1478  %src.1 = load i32, ptr %src.gep.1, align 4479  %r.1 = ashr i32 %src.1, 16480  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1481  store i32 %r.1, ptr %dst.gep.1, align 4482  ret i32 10483 484 485else:486  ret i32 0487}488 489define void @pointer_defined_in_bb(ptr %dst, ptr %src.p) {490; CHECK-LABEL: @pointer_defined_in_bb(491; CHECK-NEXT:  entry:492; CHECK-NEXT:    [[SRC:%.*]] = load ptr, ptr [[SRC_P:%.*]], align 8493; CHECK-NEXT:    [[SRC_0:%.*]] = load i32, ptr [[SRC]], align 4494; CHECK-NEXT:    [[R_0:%.*]] = ashr i32 [[SRC_0]], 16495; CHECK-NEXT:    store i32 [[R_0]], ptr [[DST:%.*]], align 4496; CHECK-NEXT:    [[SRC_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[SRC]], i64 1497; CHECK-NEXT:    [[SRC_1:%.*]] = load i32, ptr [[SRC_GEP_1]], align 4498; CHECK-NEXT:    [[R_1:%.*]] = ashr i32 [[SRC_1]], 16499; CHECK-NEXT:    [[DST_GEP_1:%.*]] = getelementptr inbounds i32, ptr [[DST]], i64 1500; CHECK-NEXT:    store i32 [[R_1]], ptr [[DST_GEP_1]], align 4501; CHECK-NEXT:    ret void502;503entry:504  %src = load ptr, ptr %src.p505  %src.0 = load i32, ptr %src, align 4506  %r.0 = ashr i32 %src.0, 16507  store i32 %r.0, ptr %dst, align 4508  %src.gep.1 = getelementptr inbounds i32, ptr %src, i64 1509  %src.1 = load i32, ptr %src.gep.1, align 4510  %r.1 = ashr i32 %src.1, 16511  %dst.gep.1 = getelementptr inbounds i32, ptr %dst, i64 1512  store i32 %r.1, ptr %dst.gep.1, align 4513  ret void514}515 516define void @clobber_same_underlying_object(ptr %this) {517; CHECK-LABEL: @clobber_same_underlying_object(518; CHECK-NEXT:  entry:519; CHECK-NEXT:    [[P_3:%.*]] = getelementptr inbounds i32, ptr [[THIS:%.*]], i32 3520; CHECK-NEXT:    store i32 10, ptr [[P_3]], align 8521; CHECK-NEXT:    tail call void @clobber()522; CHECK-NEXT:    [[P_4:%.*]] = getelementptr inbounds i32, ptr [[THIS]], i32 4523; CHECK-NEXT:    [[L2:%.*]] = load i32, ptr [[P_4]], align 8524; CHECK-NEXT:    store i32 20, ptr [[P_4]], align 8525; CHECK-NEXT:    ret void526;527entry:528  %p.3 = getelementptr inbounds i32, ptr %this, i32 3529  store i32 10, ptr %p.3, align 8530  tail call void @clobber()531  %p.4 = getelementptr inbounds i32, ptr %this, i32 4532  %l2 = load i32, ptr %p.4, align 8533  store i32 20, ptr %p.4, align 8534  ret void535}536 537declare void @clobber()538 539define void @slp_not_beneficial(ptr %A, ptr %B) {540; CHECK-LABEL: @slp_not_beneficial(541; CHECK-NEXT:  bb:542; CHECK-NEXT:    [[TMP:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 4543; CHECK-NEXT:    store i32 0, ptr [[TMP]], align 8544; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 5545; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 4546; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 8547; CHECK-NEXT:    store i32 [[TMP5]], ptr [[TMP3]], align 8548; CHECK-NEXT:    ret void549;550bb:551  %tmp = getelementptr inbounds i32, ptr %A, i32 4552  store i32 0, ptr %tmp, align 8553  %tmp3 = getelementptr inbounds i32, ptr %A, i32 5554  %tmp4 = getelementptr inbounds i32, ptr %B, i32 4555  %tmp5 = load i32, ptr %tmp4, align 8556  store i32 %tmp5, ptr %tmp3, align 8557  ret void558}559 560define void @widget(ptr %ptr, ptr %ptr.2) {561; CHECK-LABEL: @widget(562; CHECK-NEXT:  bb1:563; CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr null, align 8564; CHECK-NEXT:    [[TMP4:%.*]] = fmul double undef, [[TMP3]]565; CHECK-NEXT:    [[TMP6:%.*]] = load double, ptr [[PTR:%.*]], align 8566; CHECK-NEXT:    [[TMP7:%.*]] = fadd double [[TMP6]], [[TMP4]]567; CHECK-NEXT:    store double [[TMP7]], ptr [[PTR]], align 8568; CHECK-NEXT:    [[TMP9:%.*]] = load double, ptr [[PTR_2:%.*]], align 8569; CHECK-NEXT:    [[TMP10:%.*]] = fmul double undef, [[TMP9]]570; CHECK-NEXT:    [[TMP11:%.*]] = getelementptr inbounds double, ptr [[PTR]], i32 1571; CHECK-NEXT:    [[TMP12:%.*]] = load double, ptr [[TMP11]], align 8572; CHECK-NEXT:    [[TMP13:%.*]] = fadd double [[TMP12]], [[TMP10]]573; CHECK-NEXT:    store double [[TMP13]], ptr [[TMP11]], align 8574; CHECK-NEXT:    br label [[BB15:%.*]]575; CHECK:       bb15:576; CHECK-NEXT:    br label [[BB15]]577;578bb1:                                              ; preds = %bb579  %tmp3 = load double, ptr null, align 8580  %tmp4 = fmul double undef, %tmp3581  %tmp6 = load double, ptr %ptr, align 8582  %tmp7 = fadd double %tmp6, %tmp4583  store double %tmp7, ptr %ptr, align 8584  %tmp9 = load double, ptr %ptr.2, align 8585  %tmp10 = fmul double undef, %tmp9586  %tmp11 = getelementptr inbounds double, ptr %ptr, i32 1587  %tmp12 = load double, ptr %tmp11, align 8588  %tmp13 = fadd double %tmp12, %tmp10589  store double %tmp13, ptr %tmp11, align 8590  br label %bb15591 592bb15:                                             ; preds = %bb15, %bb14593  br label %bb15594}595 596%struct = type { i32, i32, float, float }597 598; Some points we collected as candidates for runtime checks have been removed599; before generating runtime checks. Make sure versioning is skipped.600define void @test_bounds_removed_before_runtime_checks(ptr %A, ptr %B, i1 %c) {601; CHECK-LABEL: @test_bounds_removed_before_runtime_checks(602; CHECK-NEXT:  entry:603; CHECK-NEXT:    [[TMP1:%.*]] = fmul float 1.000000e+01, 2.000000e+01604; CHECK-NEXT:    [[TMP2:%.*]] = fptosi float [[TMP1]] to i32605; CHECK-NEXT:    [[TMP3:%.*]] = fmul float 3.000000e+01, 2.000000e+01606; CHECK-NEXT:    [[TMP4:%.*]] = fptosi float [[TMP3]] to i32607; CHECK-NEXT:    [[TMP5:%.*]] = icmp sgt i32 100, [[TMP2]]608; CHECK-NEXT:    [[TMP6:%.*]] = select i1 [[TMP5]], i32 [[TMP2]], i32 10609; CHECK-NEXT:    [[TMP7:%.*]] = select i1 false, i32 0, i32 [[TMP6]]610; CHECK-NEXT:    [[TMP8:%.*]] = icmp sgt i32 200, [[TMP4]]611; CHECK-NEXT:    [[TMP9:%.*]] = select i1 [[TMP8]], i32 [[TMP4]], i32 300612; CHECK-NEXT:    [[TMP10:%.*]] = select i1 false, i32 0, i32 [[TMP9]]613; CHECK-NEXT:    store i32 [[TMP7]], ptr [[A:%.*]], align 8614; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [[STRUCT:%.*]], ptr [[A]], i64 0, i32 1615; CHECK-NEXT:    store i32 [[TMP10]], ptr [[TMP12]], align 4616; CHECK-NEXT:    [[TMP13:%.*]] = load ptr, ptr [[B:%.*]], align 8617; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB23:%.*]], label [[BB14:%.*]]618; CHECK:       bb14:619; CHECK-NEXT:    [[TMP15:%.*]] = sext i32 [[TMP7]] to i64620; CHECK-NEXT:    [[TMP16:%.*]] = add nsw i64 2, [[TMP15]]621; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds i32, ptr [[TMP13]], i64 [[TMP16]]622; CHECK-NEXT:    [[TMP19:%.*]] = getelementptr inbounds i8, ptr [[TMP17]], i64 3623; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [[STRUCT]], ptr [[A]], i64 0, i32 2624; CHECK-NEXT:    store float 0.000000e+00, ptr [[TMP20]], align 8625; CHECK-NEXT:    [[TMP21:%.*]] = load i8, ptr [[TMP19]], align 1626; CHECK-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [[STRUCT]], ptr [[A]], i64 0, i32 3627; CHECK-NEXT:    store float 0.000000e+00, ptr [[TMP22]], align 4628; CHECK-NEXT:    br label [[BB23]]629; CHECK:       bb23:630; CHECK-NEXT:    ret void631;632entry:633  %tmp1 = fmul float 10.0, 20.0634  %tmp2 = fptosi float %tmp1 to i32635  %tmp3 = fmul float 30.0, 20.0636  %tmp4 = fptosi float %tmp3 to i32637  %tmp5 = icmp sgt i32 100, %tmp2638  %tmp6 = select i1 %tmp5, i32 %tmp2, i32 10639  %tmp7 = select i1 false, i32 0, i32 %tmp6640  %tmp8 = icmp sgt i32 200, %tmp4641  %tmp9 = select i1 %tmp8, i32 %tmp4, i32 300642  %tmp10 = select i1 false, i32 0, i32 %tmp9643  store i32 %tmp7, ptr %A, align 8644  %tmp12 = getelementptr inbounds %struct, ptr %A, i64 0, i32 1645  store i32 %tmp10, ptr %tmp12, align 4646  %tmp13 = load ptr, ptr %B, align 8647  br i1 %c, label %bb23, label %bb14648 649bb14:650  %tmp15 = sext i32 %tmp7 to i64651  %tmp16 = add nsw i64 2, %tmp15652  %tmp17 = getelementptr inbounds i32, ptr %tmp13, i64 %tmp16653  %tmp19 = getelementptr inbounds i8, ptr %tmp17, i64 3654  %tmp20 = getelementptr inbounds %struct, ptr %A, i64 0, i32 2655  store float 0.0, ptr %tmp20, align 8656  %tmp21 = load i8, ptr %tmp19, align 1657  %tmp22 = getelementptr inbounds %struct, ptr %A, i64 0, i32 3658  store float 0.0, ptr %tmp22, align 4659  br label %bb23660 661bb23:662  ret void663}664 665; In this test there's a single bound, do not generate runtime checks.666define void @single_membound(ptr %arg, ptr %arg1, double %x) {667; CHECK-LABEL: @single_membound(668; CHECK-NEXT:  entry:669; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds double, ptr [[ARG:%.*]], i64 1670; CHECK-NEXT:    [[TMP:%.*]] = fsub double [[X:%.*]], 9.900000e+01671; CHECK-NEXT:    store double [[TMP]], ptr [[TMP9]], align 8672; CHECK-NEXT:    [[TMP12:%.*]] = load double, ptr [[ARG1:%.*]], align 8673; CHECK-NEXT:    [[TMP13:%.*]] = fsub double 1.000000e+00, [[TMP12]]674; CHECK-NEXT:    br label [[BB15:%.*]]675; CHECK:       bb15:676; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x double> poison, double [[TMP]], i32 0677; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> [[TMP0]], double [[TMP13]], i32 1678; CHECK-NEXT:    [[TMP2:%.*]] = fmul <2 x double> [[TMP1]], <double 2.000000e+01, double 3.000000e+01>679; CHECK-NEXT:    store <2 x double> [[TMP2]], ptr [[TMP9]], align 8680; CHECK-NEXT:    ret void681;682entry:683  %tmp = fsub double %x, 99.0684  %tmp9 = getelementptr inbounds double, ptr %arg, i64 1685  store double %tmp, ptr %tmp9, align 8686  %tmp12 = load double, ptr %arg1, align 8687  %tmp13 = fsub double 1.0, %tmp12688  %tmp14 = getelementptr inbounds double, ptr %arg, i64 2689  br label %bb15690 691bb15:692  %tmp16 = fmul double %tmp, 20.0693  store double %tmp16, ptr %tmp9, align 8694  %tmp17 = fmul double %tmp13, 30.0695  store double %tmp17, ptr %tmp14, align 8696  ret void697}698 699%struct.2 = type { [4 x float] }700 701; Make sure we do not crash when we encounter a SCEVCouldNotCompute.702define void @no_lcssa_phi(ptr %A, ptr %B, i1 %c) {703; CHECK-LABEL: @no_lcssa_phi(704; CHECK-NEXT:  bb:705; CHECK-NEXT:    br label [[LOOP:%.*]]706; CHECK:       loop:707; CHECK-NEXT:    [[PTR_PHI:%.*]] = phi ptr [ [[A:%.*]], [[BB:%.*]] ], [ null, [[LOOP]] ]708; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]709; CHECK:       exit:710; CHECK-NEXT:    [[L_0:%.*]] = load float, ptr [[B:%.*]], align 8711; CHECK-NEXT:    [[ADD_0:%.*]] = fadd float [[L_0]], 1.000000e+01712; CHECK-NEXT:    [[MUL_0:%.*]] = fmul float [[ADD_0]], 3.000000e+01713; CHECK-NEXT:    store float [[MUL_0]], ptr [[PTR_PHI]], align 8714; CHECK-NEXT:    [[B_GEP_1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 1715; CHECK-NEXT:    [[L_1:%.*]] = load float, ptr [[B_GEP_1]], align 8716; CHECK-NEXT:    [[ADD_1:%.*]] = fadd float [[L_1]], 1.000000e+01717; CHECK-NEXT:    [[MUL_1:%.*]] = fmul float [[ADD_1]], 3.000000e+01718; CHECK-NEXT:    [[A_GEP_1:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[PTR_PHI]], i64 0, i32 0, i32 1719; CHECK-NEXT:    store float [[MUL_1]], ptr [[A_GEP_1]], align 8720; CHECK-NEXT:    [[B_GEP_2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 2721; CHECK-NEXT:    [[L_2:%.*]] = load float, ptr [[B_GEP_2]], align 8722; CHECK-NEXT:    [[ADD_2:%.*]] = fadd float [[L_2]], 1.000000e+01723; CHECK-NEXT:    [[MUL_2:%.*]] = fmul float [[ADD_2]], 3.000000e+01724; CHECK-NEXT:    [[A_GEP_2:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[PTR_PHI]], i64 0, i32 0, i32 2725; CHECK-NEXT:    store float [[MUL_2]], ptr [[A_GEP_2]], align 8726; CHECK-NEXT:    [[B_GEP_3:%.*]] = getelementptr inbounds float, ptr [[B]], i64 3727; CHECK-NEXT:    [[L_3:%.*]] = load float, ptr [[B_GEP_3]], align 8728; CHECK-NEXT:    [[ADD_3:%.*]] = fadd float [[L_3]], 1.000000e+01729; CHECK-NEXT:    [[MUL_3:%.*]] = fmul float [[ADD_3]], 3.000000e+01730; CHECK-NEXT:    [[A_GEP_3:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[PTR_PHI]], i64 0, i32 0, i32 3731; CHECK-NEXT:    store float [[MUL_3]], ptr [[A_GEP_3]], align 8732; CHECK-NEXT:    ret void733;734bb:735  br label %loop736 737loop:738  %ptr.phi = phi ptr [ %A, %bb ], [ null, %loop ]739  br i1 %c, label %exit, label %loop740 741exit:742  %l.0 = load float, ptr %B, align 8743  %add.0 = fadd float %l.0, 10.0744  %mul.0 = fmul float %add.0, 30.0745  store float %mul.0, ptr %ptr.phi, align 8746  %B.gep.1 = getelementptr inbounds float, ptr %B, i64 1747  %l.1 = load float, ptr %B.gep.1, align 8748  %add.1 = fadd float %l.1, 10.0749  %mul.1 = fmul float %add.1, 30.0750  %A.gep.1 = getelementptr inbounds %struct.2, ptr %ptr.phi, i64 0, i32 0, i32 1751  store float %mul.1, ptr %A.gep.1, align 8752  %B.gep.2 = getelementptr inbounds float, ptr %B, i64 2753  %l.2 = load float, ptr %B.gep.2, align 8754  %add.2 = fadd float %l.2, 10.0755  %mul.2 = fmul float %add.2, 30.0756  %A.gep.2 = getelementptr inbounds %struct.2, ptr %ptr.phi, i64 0, i32 0, i32 2757  store float %mul.2, ptr %A.gep.2, align 8758  %B.gep.3 = getelementptr inbounds float, ptr %B, i64 3759  %l.3 = load float, ptr %B.gep.3, align 8760  %add.3 = fadd float %l.3, 10.0761  %mul.3 = fmul float %add.3, 30.0762  %A.gep.3 = getelementptr inbounds %struct.2, ptr %ptr.phi, i64 0, i32 0, i32 3763  store float %mul.3, ptr %A.gep.3, align 8764  ret void765}766 767; Make sure lcssa phis as pointer bases are handled properly.768define void @lcssa_phi(ptr %A, ptr %B, i1 %c) {769; CHECK-LABEL: @lcssa_phi(770; CHECK-NEXT:  bb:771; CHECK-NEXT:    br label [[LOOP:%.*]]772; CHECK:       loop:773; CHECK-NEXT:    [[PTR_PHI:%.*]] = phi ptr [ [[A:%.*]], [[BB:%.*]] ], [ null, [[LOOP]] ]774; CHECK-NEXT:    br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]]775; CHECK:       exit:776; CHECK-NEXT:    [[PTR_PHI_LCSSA:%.*]] = phi ptr [ [[PTR_PHI]], [[LOOP]] ]777; CHECK-NEXT:    [[L_0:%.*]] = load float, ptr [[B:%.*]], align 8778; CHECK-NEXT:    [[ADD_0:%.*]] = fadd float [[L_0]], 1.000000e+01779; CHECK-NEXT:    [[MUL_0:%.*]] = fmul float [[ADD_0]], 3.000000e+01780; CHECK-NEXT:    store float [[MUL_0]], ptr [[PTR_PHI_LCSSA]], align 8781; CHECK-NEXT:    [[B_GEP_1:%.*]] = getelementptr inbounds float, ptr [[B]], i64 1782; CHECK-NEXT:    [[L_1:%.*]] = load float, ptr [[B_GEP_1]], align 8783; CHECK-NEXT:    [[ADD_1:%.*]] = fadd float [[L_1]], 1.000000e+01784; CHECK-NEXT:    [[MUL_1:%.*]] = fmul float [[ADD_1]], 3.000000e+01785; CHECK-NEXT:    [[A_GEP_1:%.*]] = getelementptr inbounds [[STRUCT_2:%.*]], ptr [[PTR_PHI_LCSSA]], i64 0, i32 0, i32 1786; CHECK-NEXT:    store float [[MUL_1]], ptr [[A_GEP_1]], align 8787; CHECK-NEXT:    [[B_GEP_2:%.*]] = getelementptr inbounds float, ptr [[B]], i64 2788; CHECK-NEXT:    [[L_2:%.*]] = load float, ptr [[B_GEP_2]], align 8789; CHECK-NEXT:    [[ADD_2:%.*]] = fadd float [[L_2]], 1.000000e+01790; CHECK-NEXT:    [[MUL_2:%.*]] = fmul float [[ADD_2]], 3.000000e+01791; CHECK-NEXT:    [[A_GEP_2:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[PTR_PHI_LCSSA]], i64 0, i32 0, i32 2792; CHECK-NEXT:    store float [[MUL_2]], ptr [[A_GEP_2]], align 8793; CHECK-NEXT:    [[B_GEP_3:%.*]] = getelementptr inbounds float, ptr [[B]], i64 3794; CHECK-NEXT:    [[L_3:%.*]] = load float, ptr [[B_GEP_3]], align 8795; CHECK-NEXT:    [[ADD_3:%.*]] = fadd float [[L_3]], 1.000000e+01796; CHECK-NEXT:    [[MUL_3:%.*]] = fmul float [[ADD_3]], 3.000000e+01797; CHECK-NEXT:    [[A_GEP_3:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[PTR_PHI_LCSSA]], i64 0, i32 0, i32 3798; CHECK-NEXT:    store float [[MUL_3]], ptr [[A_GEP_3]], align 8799; CHECK-NEXT:    ret void800;801bb:802  br label %loop803 804loop:805  %ptr.phi = phi ptr [ %A, %bb ], [ null, %loop ]806  br i1 %c, label %exit, label %loop807 808exit:809  %ptr.phi.lcssa = phi ptr [ %ptr.phi, %loop ]810  %l.0 = load float, ptr %B, align 8811  %add.0 = fadd float %l.0, 10.0812  %mul.0 = fmul float %add.0, 30.0813  store float %mul.0, ptr %ptr.phi.lcssa, align 8814  %B.gep.1 = getelementptr inbounds float, ptr %B, i64 1815  %l.1 = load float, ptr %B.gep.1, align 8816  %add.1 = fadd float %l.1, 10.0817  %mul.1 = fmul float %add.1, 30.0818  %A.gep.1 = getelementptr inbounds %struct.2, ptr %ptr.phi.lcssa, i64 0, i32 0, i32 1819  store float %mul.1, ptr %A.gep.1, align 8820  %B.gep.2 = getelementptr inbounds float, ptr %B, i64 2821  %l.2 = load float, ptr %B.gep.2, align 8822  %add.2 = fadd float %l.2, 10.0823  %mul.2 = fmul float %add.2, 30.0824  %A.gep.2 = getelementptr inbounds %struct.2, ptr %ptr.phi.lcssa, i64 0, i32 0, i32 2825  store float %mul.2, ptr %A.gep.2, align 8826  %B.gep.3 = getelementptr inbounds float, ptr %B, i64 3827  %l.3 = load float, ptr %B.gep.3, align 8828  %add.3 = fadd float %l.3, 10.0829  %mul.3 = fmul float %add.3, 30.0830  %A.gep.3 = getelementptr inbounds %struct.2, ptr %ptr.phi.lcssa, i64 0, i32 0, i32 3831  store float %mul.3, ptr %A.gep.3, align 8832  ret void833}834 835%struct.spam = type { [60 x i32], i32, [12 x i8] }836 837declare void @foo(ptr)838 839; Test case with a basic block where parts can be vectorized without versioning.840define i32 @block_partly_vectorized_without_versioning(ptr readonly %arg, ptr nocapture readonly %arg1, ptr nocapture %arg2, ptr nocapture readonly %arg3, ptr %A, ptr %B) {841; CHECK-LABEL: @block_partly_vectorized_without_versioning(842; CHECK-NEXT:  bb:843; CHECK-NEXT:    [[T:%.*]] = alloca <16 x i8>, align 16844; CHECK-NEXT:    [[T5:%.*]] = getelementptr inbounds i8, ptr [[ARG3:%.*]], i64 1845; CHECK-NEXT:    [[T6:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 2846; CHECK-NEXT:    [[T7:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 3847; CHECK-NEXT:    [[T8:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 4848; CHECK-NEXT:    [[T9:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 5849; CHECK-NEXT:    [[T10:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 6850; CHECK-NEXT:    [[T11:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 7851; CHECK-NEXT:    [[T12:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 8852; CHECK-NEXT:    [[T13:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 9853; CHECK-NEXT:    [[T14:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 10854; CHECK-NEXT:    [[T15:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 11855; CHECK-NEXT:    [[T16:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 12856; CHECK-NEXT:    [[T17:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 13857; CHECK-NEXT:    [[T18:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 14858; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x i8>, ptr [[A:%.*]], align 1859; CHECK-NEXT:    [[TMP1:%.*]] = load <16 x i8>, ptr [[B:%.*]], align 1860; CHECK-NEXT:    [[TMP2:%.*]] = xor <16 x i8> [[TMP0]], [[TMP1]]861; CHECK-NEXT:    store <16 x i8> [[TMP2]], ptr [[ARG1:%.*]], align 1862; CHECK-NEXT:    [[T21:%.*]] = getelementptr inbounds i8, ptr [[ARG3]], i64 15863; CHECK-NEXT:    call void @foo(ptr nonnull [[T]])864; CHECK-NEXT:    [[T26:%.*]] = load i8, ptr [[ARG3]], align 1865; CHECK-NEXT:    [[T27:%.*]] = load i8, ptr [[ARG2:%.*]], align 1866; CHECK-NEXT:    [[T28:%.*]] = xor i8 [[T27]], [[T26]]867; CHECK-NEXT:    store i8 [[T28]], ptr [[ARG2]], align 1868; CHECK-NEXT:    [[T29:%.*]] = load i8, ptr [[T5]], align 1869; CHECK-NEXT:    [[T30:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 1870; CHECK-NEXT:    [[T31:%.*]] = load i8, ptr [[T30]], align 1871; CHECK-NEXT:    [[T32:%.*]] = xor i8 [[T31]], [[T29]]872; CHECK-NEXT:    store i8 [[T32]], ptr [[T30]], align 1873; CHECK-NEXT:    [[T33:%.*]] = load i8, ptr [[T6]], align 1874; CHECK-NEXT:    [[T34:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 2875; CHECK-NEXT:    [[T35:%.*]] = load i8, ptr [[T34]], align 1876; CHECK-NEXT:    [[T36:%.*]] = xor i8 [[T35]], [[T33]]877; CHECK-NEXT:    store i8 [[T36]], ptr [[T34]], align 1878; CHECK-NEXT:    [[T37:%.*]] = load i8, ptr [[T7]], align 1879; CHECK-NEXT:    [[T38:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 3880; CHECK-NEXT:    [[T39:%.*]] = load i8, ptr [[T38]], align 1881; CHECK-NEXT:    [[T40:%.*]] = xor i8 [[T39]], [[T37]]882; CHECK-NEXT:    store i8 [[T40]], ptr [[T38]], align 1883; CHECK-NEXT:    [[T41:%.*]] = load i8, ptr [[T8]], align 1884; CHECK-NEXT:    [[T42:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 4885; CHECK-NEXT:    [[T43:%.*]] = load i8, ptr [[T42]], align 1886; CHECK-NEXT:    [[T44:%.*]] = xor i8 [[T43]], [[T41]]887; CHECK-NEXT:    store i8 [[T44]], ptr [[T42]], align 1888; CHECK-NEXT:    [[T45:%.*]] = load i8, ptr [[T9]], align 1889; CHECK-NEXT:    [[T46:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 5890; CHECK-NEXT:    [[T47:%.*]] = load i8, ptr [[T46]], align 1891; CHECK-NEXT:    [[T48:%.*]] = xor i8 [[T47]], [[T45]]892; CHECK-NEXT:    store i8 [[T48]], ptr [[T46]], align 1893; CHECK-NEXT:    [[T49:%.*]] = load i8, ptr [[T10]], align 1894; CHECK-NEXT:    [[T50:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 6895; CHECK-NEXT:    [[T51:%.*]] = load i8, ptr [[T50]], align 1896; CHECK-NEXT:    [[T52:%.*]] = xor i8 [[T51]], [[T49]]897; CHECK-NEXT:    store i8 [[T52]], ptr [[T50]], align 1898; CHECK-NEXT:    [[T53:%.*]] = load i8, ptr [[T11]], align 1899; CHECK-NEXT:    [[T54:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 7900; CHECK-NEXT:    [[T55:%.*]] = load i8, ptr [[T54]], align 1901; CHECK-NEXT:    [[T56:%.*]] = xor i8 [[T55]], [[T53]]902; CHECK-NEXT:    store i8 [[T56]], ptr [[T54]], align 1903; CHECK-NEXT:    [[T57:%.*]] = load i8, ptr [[T12]], align 1904; CHECK-NEXT:    [[T58:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 8905; CHECK-NEXT:    [[T59:%.*]] = load i8, ptr [[T58]], align 1906; CHECK-NEXT:    [[T60:%.*]] = xor i8 [[T59]], [[T57]]907; CHECK-NEXT:    store i8 [[T60]], ptr [[T58]], align 1908; CHECK-NEXT:    [[T61:%.*]] = load i8, ptr [[T13]], align 1909; CHECK-NEXT:    [[T62:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 9910; CHECK-NEXT:    [[T63:%.*]] = load i8, ptr [[T62]], align 1911; CHECK-NEXT:    [[T64:%.*]] = xor i8 [[T63]], [[T61]]912; CHECK-NEXT:    store i8 [[T64]], ptr [[T62]], align 1913; CHECK-NEXT:    [[T65:%.*]] = load i8, ptr [[T14]], align 1914; CHECK-NEXT:    [[T66:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 10915; CHECK-NEXT:    [[T67:%.*]] = load i8, ptr [[T66]], align 1916; CHECK-NEXT:    [[T68:%.*]] = xor i8 [[T67]], [[T65]]917; CHECK-NEXT:    store i8 [[T68]], ptr [[T66]], align 1918; CHECK-NEXT:    [[T69:%.*]] = load i8, ptr [[T15]], align 1919; CHECK-NEXT:    [[T70:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 11920; CHECK-NEXT:    [[T71:%.*]] = load i8, ptr [[T70]], align 1921; CHECK-NEXT:    [[T72:%.*]] = xor i8 [[T71]], [[T69]]922; CHECK-NEXT:    store i8 [[T72]], ptr [[T70]], align 1923; CHECK-NEXT:    [[T73:%.*]] = load i8, ptr [[T16]], align 1924; CHECK-NEXT:    [[T74:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 12925; CHECK-NEXT:    [[T75:%.*]] = load i8, ptr [[T74]], align 1926; CHECK-NEXT:    [[T76:%.*]] = xor i8 [[T75]], [[T73]]927; CHECK-NEXT:    store i8 [[T76]], ptr [[T74]], align 1928; CHECK-NEXT:    [[T77:%.*]] = load i8, ptr [[T17]], align 1929; CHECK-NEXT:    [[T78:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 13930; CHECK-NEXT:    [[T79:%.*]] = load i8, ptr [[T78]], align 1931; CHECK-NEXT:    [[T80:%.*]] = xor i8 [[T79]], [[T77]]932; CHECK-NEXT:    store i8 [[T80]], ptr [[T78]], align 1933; CHECK-NEXT:    [[T81:%.*]] = load i8, ptr [[T18]], align 1934; CHECK-NEXT:    [[T82:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 14935; CHECK-NEXT:    [[T83:%.*]] = load i8, ptr [[T82]], align 1936; CHECK-NEXT:    [[T84:%.*]] = xor i8 [[T83]], [[T81]]937; CHECK-NEXT:    store i8 [[T84]], ptr [[T82]], align 1938; CHECK-NEXT:    [[T85:%.*]] = load i8, ptr [[T21]], align 1939; CHECK-NEXT:    [[T86:%.*]] = getelementptr inbounds i8, ptr [[ARG2]], i64 15940; CHECK-NEXT:    [[T87:%.*]] = load i8, ptr [[T86]], align 1941; CHECK-NEXT:    [[T88:%.*]] = xor i8 [[T87]], [[T85]]942; CHECK-NEXT:    store i8 [[T88]], ptr [[T86]], align 1943; CHECK-NEXT:    ret i32 1944;945bb:946  %t = alloca <16 x i8>, align 16947  %t5 = getelementptr inbounds i8, ptr %arg3, i64 1948  %t6 = getelementptr inbounds i8, ptr %arg3, i64 2949  %t7 = getelementptr inbounds i8, ptr %arg3, i64 3950  %t8 = getelementptr inbounds i8, ptr %arg3, i64 4951  %t9 = getelementptr inbounds i8, ptr %arg3, i64 5952  %t10 = getelementptr inbounds i8, ptr %arg3, i64 6953  %t11 = getelementptr inbounds i8, ptr %arg3, i64 7954  %t12 = getelementptr inbounds i8, ptr %arg3, i64 8955  %t13 = getelementptr inbounds i8, ptr %arg3, i64 9956  %t14 = getelementptr inbounds i8, ptr %arg3, i64 10957  %t15 = getelementptr inbounds i8, ptr %arg3, i64 11958  %t16 = getelementptr inbounds i8, ptr %arg3, i64 12959  %t17 = getelementptr inbounds i8, ptr %arg3, i64 13960  %t18 = getelementptr inbounds i8, ptr %arg3, i64 14961  %A.0 = load i8, ptr %A962  %B.0 = load i8, ptr %B963  %xor.0 = xor i8 %A.0, %B.0964  %A.gep.1 = getelementptr i8, ptr %A, i64 1965  %A.1 = load i8, ptr %A.gep.1966  %B.gep.1 = getelementptr i8, ptr %B, i64 1967  %B.1 = load i8, ptr %B.gep.1968  %xor.1 = xor i8 %A.1, %B.1969  %A.gep.2 = getelementptr i8, ptr %A, i64 2970  %A.2 = load i8, ptr %A.gep.2971  %B.gep.2 = getelementptr i8, ptr %B, i64 2972  %B.2 = load i8, ptr %B.gep.2973  %xor.2 = xor i8 %A.2, %B.2974  %A.gep.3 = getelementptr i8, ptr %A, i64 3975  %A.3 = load i8, ptr %A.gep.3976  %B.gep.3 = getelementptr i8, ptr %B, i64 3977  %B.3 = load i8, ptr %B.gep.3978  %xor.3 = xor i8 %A.3, %B.3979  %A.gep.4 = getelementptr i8, ptr %A, i64 4980  %A.4 = load i8, ptr %A.gep.4981  %B.gep.4 = getelementptr i8, ptr %B, i64 4982  %B.4 = load i8, ptr %B.gep.4983  %xor.4 = xor i8 %A.4, %B.4984  %A.gep.5 = getelementptr i8, ptr %A, i64 5985  %A.5 = load i8, ptr %A.gep.5986  %B.gep.5 = getelementptr i8, ptr %B, i64 5987  %B.5 = load i8, ptr %B.gep.5988  %xor.5 = xor i8 %A.5, %B.5989  %A.gep.6 = getelementptr i8, ptr %A, i64 6990  %A.6 = load i8, ptr %A.gep.6991  %B.gep.6 = getelementptr i8, ptr %B, i64 6992  %B.6 = load i8, ptr %B.gep.6993  %xor.6 = xor i8 %A.6, %B.6994  %A.gep.7 = getelementptr i8, ptr %A, i64 7995  %A.7 = load i8, ptr %A.gep.7996  %B.gep.7 = getelementptr i8, ptr %B, i64 7997  %B.7 = load i8, ptr %B.gep.7998  %xor.7 = xor i8 %A.7, %B.7999  %A.gep.8 = getelementptr i8, ptr %A, i64 81000  %A.8 = load i8, ptr %A.gep.81001  %B.gep.8 = getelementptr i8, ptr %B, i64 81002  %B.8 = load i8, ptr %B.gep.81003  %xor.8 = xor i8 %A.8, %B.81004  %A.gep.9 = getelementptr i8, ptr %A, i64 91005  %A.9 = load i8, ptr %A.gep.91006  %B.gep.9 = getelementptr i8, ptr %B, i64 91007  %B.9 = load i8, ptr %B.gep.91008  %xor.9 = xor i8 %A.9, %B.91009  %A.gep.10 = getelementptr i8, ptr %A, i64 101010  %A.10 = load i8, ptr %A.gep.101011  %B.gep.10 = getelementptr i8, ptr %B, i64 101012  %B.10 = load i8, ptr %B.gep.101013  %xor.10 = xor i8 %A.10, %B.101014  %A.gep.11 = getelementptr i8, ptr %A, i64 111015  %A.11 = load i8, ptr %A.gep.111016  %B.gep.11 = getelementptr i8, ptr %B, i64 111017  %B.11 = load i8, ptr %B.gep.111018  %xor.11 = xor i8 %A.11, %B.111019  %A.gep.12 = getelementptr i8, ptr %A, i64 121020  %A.12 = load i8, ptr %A.gep.121021  %B.gep.12 = getelementptr i8, ptr %B, i64 121022  %B.12 = load i8, ptr %B.gep.121023  %xor.12 = xor i8 %A.12, %B.121024  %A.gep.13 = getelementptr i8, ptr %A, i64 131025  %A.13 = load i8, ptr %A.gep.131026  %B.gep.13 = getelementptr i8, ptr %B, i64 131027  %B.13 = load i8, ptr %B.gep.131028  %xor.13 = xor i8 %A.13, %B.131029  %A.gep.14 = getelementptr i8, ptr %A, i64 141030  %A.14 = load i8, ptr %A.gep.141031  %B.gep.14 = getelementptr i8, ptr %B, i64 141032  %B.14 = load i8, ptr %B.gep.141033  %xor.14 = xor i8 %A.14, %B.141034  %A.gep.15 = getelementptr i8, ptr %A, i64 151035  %A.15 = load i8, ptr %A.gep.151036  %B.gep.15 = getelementptr i8, ptr %B, i64 151037  %B.15 = load i8, ptr %B.gep.151038  %xor.15 = xor i8 %A.15, %B.151039  store i8 %xor.0, ptr %arg11040  %R.gep.1 = getelementptr i8, ptr %arg1, i64 11041  store i8 %xor.1, ptr %R.gep.11042  %R.gep.2 = getelementptr i8, ptr %arg1, i64 21043  store i8 %xor.2, ptr %R.gep.21044  %R.gep.3 = getelementptr i8, ptr %arg1, i64 31045  store i8 %xor.3, ptr %R.gep.31046  %R.gep.4 = getelementptr i8, ptr %arg1, i64 41047  store i8 %xor.4, ptr %R.gep.41048  %R.gep.5 = getelementptr i8, ptr %arg1, i64 51049  store i8 %xor.5, ptr %R.gep.51050  %R.gep.6 = getelementptr i8, ptr %arg1, i64 61051  store i8 %xor.6, ptr %R.gep.61052  %R.gep.7 = getelementptr i8, ptr %arg1, i64 71053  store i8 %xor.7, ptr %R.gep.71054  %R.gep.8 = getelementptr i8, ptr %arg1, i64 81055  store i8 %xor.8, ptr %R.gep.81056  %R.gep.9 = getelementptr i8, ptr %arg1, i64 91057  store i8 %xor.9, ptr %R.gep.91058  %R.gep.10 = getelementptr i8, ptr %arg1, i64 101059  store i8 %xor.10, ptr %R.gep.101060  %R.gep.11 = getelementptr i8, ptr %arg1, i64 111061  store i8 %xor.11, ptr %R.gep.111062  %R.gep.12 = getelementptr i8, ptr %arg1, i64 121063  store i8 %xor.12, ptr %R.gep.121064  %R.gep.13 = getelementptr i8, ptr %arg1, i64 131065  store i8 %xor.13, ptr %R.gep.131066  %R.gep.14 = getelementptr i8, ptr %arg1, i64 141067  store i8 %xor.14, ptr %R.gep.141068  %R.gep.15 = getelementptr i8, ptr %arg1, i64 151069  store i8 %xor.15, ptr %R.gep.151070 1071 1072  %t21 = getelementptr inbounds i8, ptr %arg3, i64 151073 1074  call void @foo(ptr nonnull %t)1075  %t26 = load i8, ptr %arg3, align 11076  %t27 = load i8, ptr %arg2, align 11077  %t28 = xor i8 %t27, %t261078  store i8 %t28, ptr %arg2, align 11079  %t29 = load i8, ptr %t5, align 11080  %t30 = getelementptr inbounds i8, ptr %arg2, i64 11081  %t31 = load i8, ptr %t30, align 11082  %t32 = xor i8 %t31, %t291083  store i8 %t32, ptr %t30, align 11084  %t33 = load i8, ptr %t6, align 11085  %t34 = getelementptr inbounds i8, ptr %arg2, i64 21086  %t35 = load i8, ptr %t34, align 11087  %t36 = xor i8 %t35, %t331088  store i8 %t36, ptr %t34, align 11089  %t37 = load i8, ptr %t7, align 11090  %t38 = getelementptr inbounds i8, ptr %arg2, i64 31091  %t39 = load i8, ptr %t38, align 11092  %t40 = xor i8 %t39, %t371093  store i8 %t40, ptr %t38, align 11094  %t41 = load i8, ptr %t8, align 11095  %t42 = getelementptr inbounds i8, ptr %arg2, i64 41096  %t43 = load i8, ptr %t42, align 11097  %t44 = xor i8 %t43, %t411098  store i8 %t44, ptr %t42, align 11099  %t45 = load i8, ptr %t9, align 11100  %t46 = getelementptr inbounds i8, ptr %arg2, i64 51101  %t47 = load i8, ptr %t46, align 11102  %t48 = xor i8 %t47, %t451103  store i8 %t48, ptr %t46, align 11104  %t49 = load i8, ptr %t10, align 11105  %t50 = getelementptr inbounds i8, ptr %arg2, i64 61106  %t51 = load i8, ptr %t50, align 11107  %t52 = xor i8 %t51, %t491108  store i8 %t52, ptr %t50, align 11109  %t53 = load i8, ptr %t11, align 11110  %t54 = getelementptr inbounds i8, ptr %arg2, i64 71111  %t55 = load i8, ptr %t54, align 11112  %t56 = xor i8 %t55, %t531113  store i8 %t56, ptr %t54, align 11114  %t57 = load i8, ptr %t12, align 11115  %t58 = getelementptr inbounds i8, ptr %arg2, i64 81116  %t59 = load i8, ptr %t58, align 11117  %t60 = xor i8 %t59, %t571118  store i8 %t60, ptr %t58, align 11119  %t61 = load i8, ptr %t13, align 11120  %t62 = getelementptr inbounds i8, ptr %arg2, i64 91121  %t63 = load i8, ptr %t62, align 11122  %t64 = xor i8 %t63, %t611123  store i8 %t64, ptr %t62, align 11124  %t65 = load i8, ptr %t14, align 11125  %t66 = getelementptr inbounds i8, ptr %arg2, i64 101126  %t67 = load i8, ptr %t66, align 11127  %t68 = xor i8 %t67, %t651128  store i8 %t68, ptr %t66, align 11129  %t69 = load i8, ptr %t15, align 11130  %t70 = getelementptr inbounds i8, ptr %arg2, i64 111131  %t71 = load i8, ptr %t70, align 11132  %t72 = xor i8 %t71, %t691133  store i8 %t72, ptr %t70, align 11134  %t73 = load i8, ptr %t16, align 11135  %t74 = getelementptr inbounds i8, ptr %arg2, i64 121136  %t75 = load i8, ptr %t74, align 11137  %t76 = xor i8 %t75, %t731138  store i8 %t76, ptr %t74, align 11139  %t77 = load i8, ptr %t17, align 11140  %t78 = getelementptr inbounds i8, ptr %arg2, i64 131141  %t79 = load i8, ptr %t78, align 11142  %t80 = xor i8 %t79, %t771143  store i8 %t80, ptr %t78, align 11144  %t81 = load i8, ptr %t18, align 11145  %t82 = getelementptr inbounds i8, ptr %arg2, i64 141146  %t83 = load i8, ptr %t82, align 11147  %t84 = xor i8 %t83, %t811148  store i8 %t84, ptr %t82, align 11149  %t85 = load i8, ptr %t21, align 11150  %t86 = getelementptr inbounds i8, ptr %arg2, i64 151151  %t87 = load i8, ptr %t86, align 11152  %t88 = xor i8 %t87, %t851153  store i8 %t88, ptr %t86, align 11154  ret i32 11155}1156 1157; A test case where instructions required to compute the pointer bounds get1158; vectorized before versioning. Make sure there is no crash.1159define void @crash_instructions_deleted(ptr %t, ptr %a, ptr noalias %ptr) {1160; CHECK-LABEL: @crash_instructions_deleted(1161; CHECK-NEXT:  bb:1162; CHECK-NEXT:    [[T15:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 21163; CHECK-NEXT:    store <2 x i32> <i32 0, i32 10>, ptr [[T15]], align 81164; CHECK-NEXT:    [[T17:%.*]] = load ptr, ptr [[PTR:%.*]], align 81165; CHECK-NEXT:    br label [[BB18:%.*]]1166; CHECK:       bb18:1167; CHECK-NEXT:    [[T19:%.*]] = sext i32 0 to i641168; CHECK-NEXT:    [[T20:%.*]] = add nsw i64 1, [[T19]]1169; CHECK-NEXT:    [[T21:%.*]] = getelementptr inbounds i32, ptr [[T17]], i64 [[T20]]1170; CHECK-NEXT:    [[T23:%.*]] = getelementptr inbounds i8, ptr [[T21]], i64 11171; CHECK-NEXT:    [[T24:%.*]] = getelementptr inbounds i8, ptr [[T21]], i64 21172; CHECK-NEXT:    [[T25:%.*]] = getelementptr inbounds i8, ptr [[T21]], i64 31173; CHECK-NEXT:    [[T26:%.*]] = load i8, ptr [[T21]], align 11174; CHECK-NEXT:    [[T27:%.*]] = uitofp i8 [[T26]] to float1175; CHECK-NEXT:    [[T28:%.*]] = fdiv float [[T27]], 2.550000e+021176; CHECK-NEXT:    store float [[T28]], ptr [[T:%.*]], align 81177; CHECK-NEXT:    [[T30:%.*]] = load i8, ptr [[T23]], align 11178; CHECK-NEXT:    [[T31:%.*]] = uitofp i8 [[T30]] to float1179; CHECK-NEXT:    [[T32:%.*]] = fdiv float [[T31]], 2.550000e+021180; CHECK-NEXT:    [[T33:%.*]] = getelementptr inbounds float, ptr [[T]], i64 11181; CHECK-NEXT:    store float [[T32]], ptr [[T33]], align 41182; CHECK-NEXT:    [[T34:%.*]] = load i8, ptr [[T24]], align 11183; CHECK-NEXT:    [[T35:%.*]] = uitofp i8 [[T34]] to float1184; CHECK-NEXT:    [[T36:%.*]] = fdiv float [[T35]], 2.550000e+021185; CHECK-NEXT:    [[T37:%.*]] = getelementptr inbounds float, ptr [[T]], i64 21186; CHECK-NEXT:    store float [[T36]], ptr [[T37]], align 81187; CHECK-NEXT:    [[T38:%.*]] = load i8, ptr [[T25]], align 11188; CHECK-NEXT:    [[T39:%.*]] = uitofp i8 [[T38]] to float1189; CHECK-NEXT:    [[T40:%.*]] = fdiv float [[T39]], 2.550000e+021190; CHECK-NEXT:    [[T41:%.*]] = getelementptr inbounds float, ptr [[T]], i64 31191; CHECK-NEXT:    store float [[T40]], ptr [[T41]], align 41192; CHECK-NEXT:    ret void1193;1194bb:1195  %t6 = icmp slt i32 10, 01196  %t7 = icmp sgt i32 20, 201197  %t9 = select i1 %t7, i32 5, i32 01198  %t10 = select i1 %t6, i32 0, i32 %t91199  %t11 = icmp slt i32 10, 01200  %t12 = icmp sgt i32 20, 201201  %t13 = select i1 %t12, i32 5, i32 101202  %t14 = select i1 %t11, i32 0, i32 %t131203  %t15 = getelementptr inbounds i32, ptr %a, i32 21204  store i32 %t10, ptr %t15, align 81205  %t16 = getelementptr inbounds i32, ptr %a, i32 31206  store i32 %t14, ptr %t16, align 41207  %t17 = load ptr, ptr %ptr, align 81208  br label %bb181209 1210bb18:                                             ; preds = %bb51211  %t19 = sext i32 %t10 to i641212  %t20 = add nsw i64 1, %t191213  %t21 = getelementptr inbounds i32, ptr %t17, i64 %t201214  %t23 = getelementptr inbounds i8, ptr %t21, i64 11215  %t24 = getelementptr inbounds i8, ptr %t21, i64 21216  %t25 = getelementptr inbounds i8, ptr %t21, i64 31217  %t26 = load i8, ptr %t21, align 11218  %t27 = uitofp i8 %t26 to float1219  %t28 = fdiv float %t27, 2.550000e+021220  store float %t28, ptr %t, align 81221  %t30 = load i8, ptr %t23, align 11222  %t31 = uitofp i8 %t30 to float1223  %t32 = fdiv float %t31, 2.550000e+021224  %t33 = getelementptr inbounds float, ptr %t, i64 11225  store float %t32, ptr %t33, align 41226  %t34 = load i8, ptr %t24, align 11227  %t35 = uitofp i8 %t34 to float1228  %t36 = fdiv float %t35, 2.550000e+021229  %t37 = getelementptr inbounds float, ptr %t, i64 21230  store float %t36, ptr %t37, align 81231  %t38 = load i8, ptr %t25, align 11232  %t39 = uitofp i8 %t38 to float1233  %t40 = fdiv float %t39, 2.550000e+021234  %t41 = getelementptr inbounds float, ptr %t, i64 31235  store float %t40, ptr %t41, align 41236  ret void1237}1238 1239; A test case where there are no instructions accessing a tracked object in a1240; block for which versioning was requested.1241define void @crash_no_tracked_instructions(ptr %arg, ptr %arg.2, ptr %arg.3, i1 %c) {1242; CHECK-LABEL: @crash_no_tracked_instructions(1243; CHECK-NEXT:  entry:1244; CHECK-NEXT:    [[T19:%.*]] = load ptr, ptr [[ARG:%.*]], align 81245; CHECK-NEXT:    [[T20:%.*]] = load float, ptr [[ARG_3:%.*]], align 41246; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> <float 0.000000e+00, float poison>, float [[T20]], i32 11247; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB22:%.*]], label [[BB30:%.*]]1248; CHECK:       bb22:1249; CHECK-NEXT:    [[T23:%.*]] = fmul float [[T20]], 9.900000e+011250; CHECK-NEXT:    [[T25:%.*]] = getelementptr inbounds float, ptr [[T19]], i64 21251; CHECK-NEXT:    [[T26:%.*]] = fmul float [[T23]], 1.000000e+011252; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> poison, float [[T23]], i32 01253; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x float> [[TMP1]], <2 x float> poison, <2 x i32> zeroinitializer1254; CHECK-NEXT:    [[TMP3:%.*]] = fmul <2 x float> [[TMP2]], <float 9.900000e+01, float 1.000000e+01>1255; CHECK-NEXT:    store float [[T26]], ptr [[T25]], align 41256; CHECK-NEXT:    [[T27:%.*]] = load float, ptr [[ARG_2:%.*]], align 81257; CHECK-NEXT:    [[TMP4:%.*]] = fadd <2 x float> [[TMP3]], splat (float 2.000000e+01)1258; CHECK-NEXT:    br label [[BB30]]1259; CHECK:       bb30:1260; CHECK-NEXT:    [[TMP5:%.*]] = phi <2 x float> [ [[TMP4]], [[BB22]] ], [ [[TMP0]], [[ENTRY:%.*]] ]1261; CHECK-NEXT:    br label [[BB36:%.*]]1262; CHECK:       bb36:1263; CHECK-NEXT:    [[TMP6:%.*]] = fmul <2 x float> [[TMP5]], splat (float 3.000000e+00)1264; CHECK-NEXT:    store <2 x float> [[TMP6]], ptr [[ARG_3]], align 41265; CHECK-NEXT:    br label [[BB41:%.*]]1266; CHECK:       bb41:1267; CHECK-NEXT:    ret void1268;1269entry:1270  %t19 = load ptr, ptr %arg1271  %t20 = load float, ptr %arg.3, align 41272  br i1 %c, label %bb22, label %bb301273 1274bb22:1275  %t23 = fmul float %t20, 99.01276  %t24 = fmul float %t23, 99.01277  %t25 = getelementptr inbounds float, ptr %t19, i64 21278  %t26 = fmul float %t23, 10.01279  store float %t26, ptr %t25, align 41280  %t27 = load float, ptr %arg.2, align 81281  %t28 = fadd float %t24, 20.01282  %t29 = fadd float %t26, 20.01283  br label %bb301284 1285bb30:1286  %t31 = phi float [ %t28, %bb22 ], [ 0.0, %entry ]1287  %t32 = phi float [ %t29, %bb22 ], [ %t20, %entry ]1288  br label %bb361289 1290bb36:1291  %t37 = fmul float %t31, 3.01292  store float %t37, ptr %arg.3, align 41293  %t39 = fmul float %t32, 3.01294  %t40 = getelementptr inbounds float, ptr %arg.3, i64 11295  store float %t39, ptr %t40, align 41296  br label %bb411297 1298bb41:1299  ret void1300}1301