380 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v | FileCheck %s3 4declare void @g()5 6; Shouldn't be vectorized7define void @f0(i1 %c, ptr %p, ptr %q) {8; CHECK-LABEL: define void @f0(9; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {10; CHECK-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 811; CHECK-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 112; CHECK-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 813; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]14; CHECK: [[FOO]]:15; CHECK-NEXT: call void @g()16; CHECK-NEXT: call void @g()17; CHECK-NEXT: call void @g()18; CHECK-NEXT: br label %[[BAZ:.*]]19; CHECK: [[BAR]]:20; CHECK-NEXT: call void @g()21; CHECK-NEXT: call void @g()22; CHECK-NEXT: call void @g()23; CHECK-NEXT: br label %[[BAZ]]24; CHECK: [[BAZ]]:25; CHECK-NEXT: store i64 [[X0]], ptr [[Q]], align 826; CHECK-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 127; CHECK-NEXT: store i64 [[X1]], ptr [[Q1]], align 828; CHECK-NEXT: ret void29;30 %x0 = load i64, ptr %p31 %p1 = getelementptr i64, ptr %p, i64 132 %x1 = load i64, ptr %p133 br i1 %c, label %foo, label %bar34foo:35 call void @g()36 call void @g()37 call void @g()38 br label %baz39bar:40 call void @g()41 call void @g()42 call void @g()43 br label %baz44baz:45 store i64 %x0, ptr %q46 %q1 = getelementptr i64, ptr %q, i64 147 store i64 %x1, ptr %q148 49 ret void50}51 52; Should be vectorized - just one spill of TMP053define void @f1(i1 %c, ptr %p, ptr %q, ptr %r) {54; CHECK-LABEL: define void @f1(55; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {56; CHECK-NEXT: [[ENTRY:.*:]]57; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 858; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]59; CHECK: [[FOO]]:60; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)61; CHECK-NEXT: br label %[[BAZ:.*]]62; CHECK: [[BAR]]:63; CHECK-NEXT: call void @g()64; CHECK-NEXT: call void @g()65; CHECK-NEXT: call void @g()66; CHECK-NEXT: br label %[[BAZ]]67; CHECK: [[BAZ]]:68; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i64> [ [[TMP1]], %[[FOO]] ], [ [[TMP0]], %[[BAR]] ]69; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr [[Q]], align 870; CHECK-NEXT: ret void71;72entry:73 %x0 = load i64, ptr %p74 %p1 = getelementptr i64, ptr %p, i64 175 %x1 = load i64, ptr %p176 br i1 %c, label %foo, label %bar77foo:78 %y0 = add i64 %x0, 179 %y1 = add i64 %x1, 180 br label %baz81bar:82 call void @g()83 call void @g()84 call void @g()85 br label %baz86baz:87 %phi0 = phi i64 [%y0, %foo], [%x0, %bar]88 %phi1 = phi i64 [%y1, %foo], [%x1, %bar]89 store i64 %phi0, ptr %q90 %q1 = getelementptr i64, ptr %q, i64 191 store i64 %phi1, ptr %q192 93 ret void94}95 96; Shouldn't be vectorized97define void @f11(i1 %c, ptr %p, ptr %q, ptr %r) {98; CHECK-LABEL: define void @f11(99; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {100; CHECK-NEXT: [[ENTRY:.*:]]101; CHECK-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 8102; CHECK-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 1103; CHECK-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 8104; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]105; CHECK: [[FOO]]:106; CHECK-NEXT: br label %[[BAZ:.*]]107; CHECK: [[BAR]]:108; CHECK-NEXT: call void @g()109; CHECK-NEXT: call void @g()110; CHECK-NEXT: call void @g()111; CHECK-NEXT: br label %[[BAZ]]112; CHECK: [[BAZ]]:113; CHECK-NEXT: [[PHI0:%.*]] = phi i64 [ 0, %[[FOO]] ], [ [[X0]], %[[BAR]] ]114; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ 1, %[[FOO]] ], [ [[X1]], %[[BAR]] ]115; CHECK-NEXT: store i64 [[PHI0]], ptr [[Q]], align 8116; CHECK-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 1117; CHECK-NEXT: store i64 [[PHI1]], ptr [[Q1]], align 8118; CHECK-NEXT: ret void119;120entry:121 %x0 = load i64, ptr %p122 %p1 = getelementptr i64, ptr %p, i64 1123 %x1 = load i64, ptr %p1124 br i1 %c, label %foo, label %bar125foo:126 br label %baz127bar:128 call void @g()129 call void @g()130 call void @g()131 br label %baz132baz:133 %phi0 = phi i64 [0, %foo], [%x0, %bar]134 %phi1 = phi i64 [1, %foo], [%x1, %bar]135 store i64 %phi0, ptr %q136 %q1 = getelementptr i64, ptr %q, i64 1137 store i64 %phi1, ptr %q1138 139 ret void140}141 142; Should be vectorized143define void @f2(i1 %c, ptr %p, ptr %q, ptr %r) {144; CHECK-LABEL: define void @f2(145; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {146; CHECK-NEXT: [[ENTRY:.*]]:147; CHECK-NEXT: call void @g()148; CHECK-NEXT: call void @g()149; CHECK-NEXT: call void @g()150; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]151; CHECK: [[FOO]]:152; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8153; CHECK-NEXT: br label %[[BAR]]154; CHECK: [[BAR]]:155; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x i64> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP0]], %[[FOO]] ]156; CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[Q]], align 8157; CHECK-NEXT: ret void158;159entry:160 call void @g()161 call void @g()162 call void @g()163 br i1 %c, label %foo, label %bar164foo:165 %x0 = load i64, ptr %p166 %p1 = getelementptr i64, ptr %p, i64 1167 %x1 = load i64, ptr %p1168 br label %bar169bar:170 %phi0 = phi i64 [0, %entry], [%x0, %foo]171 %phi1 = phi i64 [0, %entry], [%x1, %foo]172 store i64 %phi0, ptr %q173 %q1 = getelementptr i64, ptr %q, i64 1174 store i64 %phi1, ptr %q1175 176 ret void177}178 179 180; Shouldn't be vectorized181define void @f3(i64 %n, double %f0, double %f1, ptr %q) {182; CHECK-LABEL: define void @f3(183; CHECK-SAME: i64 [[N:%.*]], double [[F0:%.*]], double [[F1:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {184; CHECK-NEXT: [[ENTRY:.*]]:185; CHECK-NEXT: br label %[[LOOP:.*]]186; CHECK: [[LOOP]]:187; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LATCH:.*]] ]188; CHECK-NEXT: [[PHI0:%.*]] = phi double [ [[F0]], %[[ENTRY]] ], [ [[X0:%.*]], %[[LATCH]] ]189; CHECK-NEXT: [[PHI1:%.*]] = phi double [ [[F1]], %[[ENTRY]] ], [ [[X1:%.*]], %[[LATCH]] ]190; CHECK-NEXT: call void @g()191; CHECK-NEXT: call void @g()192; CHECK-NEXT: call void @g()193; CHECK-NEXT: br label %[[LATCH]]194; CHECK: [[LATCH]]:195; CHECK-NEXT: [[X0]] = fadd double [[PHI0]], 1.000000e+00196; CHECK-NEXT: [[X1]] = fadd double [[PHI1]], 1.000000e+00197; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 1198; CHECK-NEXT: [[DONE:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]199; CHECK-NEXT: br i1 [[DONE]], label %[[EXIT:.*]], label %[[LOOP]]200; CHECK: [[EXIT]]:201; CHECK-NEXT: [[Q_GEP0:%.*]] = getelementptr i64, ptr [[Q]], i64 [[IV]]202; CHECK-NEXT: store double [[X0]], ptr [[Q_GEP0]], align 8203; CHECK-NEXT: [[Q_GEP1:%.*]] = getelementptr i64, ptr [[Q_GEP0]], i64 1204; CHECK-NEXT: store double [[X1]], ptr [[Q_GEP1]], align 8205; CHECK-NEXT: ret void206;207entry:208 br label %loop209loop:210 %iv = phi i64 [0, %entry], [%iv.next, %latch]211 %phi0 = phi double [%f0, %entry], [%x0, %latch]212 %phi1 = phi double [%f1, %entry], [%x1, %latch]213 call void @g()214 call void @g()215 call void @g()216 br label %latch217latch:218 %x0 = fadd double %phi0, 1.0219 %x1 = fadd double %phi1, 1.0220 221 %iv.next = add i64 %iv, 1222 %done = icmp eq i64 %iv.next, %n223 br i1 %done, label %exit, label %loop224exit:225 %q.gep0 = getelementptr i64, ptr %q, i64 %iv226 store double %x0, ptr %q.gep0227 %q.gep1 = getelementptr i64, ptr %q.gep0, i64 1228 store double %x1, ptr %q.gep1229 ret void230}231 232; Should be vectorized233define void @f4(ptr %p, ptr %q, i1 %c0, i1 %c1) {234; CHECK-LABEL: define void @f4(235; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]], i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR0]] {236; CHECK-NEXT: [[ENTRY:.*:]]237; CHECK-NEXT: br label %[[FOO:.*]]238; CHECK: [[FOO]]:239; CHECK-NEXT: call void @g()240; CHECK-NEXT: call void @g()241; CHECK-NEXT: call void @g()242; CHECK-NEXT: br label %[[BAR:.*]]243; CHECK: [[BAR]]:244; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8245; CHECK-NEXT: br i1 [[C0]], label %[[BAZ:.*]], label %[[QUX:.*]]246; CHECK: [[BAZ]]:247; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)248; CHECK-NEXT: br label %[[QUX]]249; CHECK: [[QUX]]:250; CHECK-NEXT: [[TMP2:%.*]] = phi <2 x i64> [ [[TMP0]], %[[BAR]] ], [ [[TMP1]], %[[BAZ]] ]251; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr [[Q]], align 8252; CHECK-NEXT: br i1 [[C1]], label %[[FOO]], label %[[BAR]]253;254entry:255 br label %foo256foo:257 call void @g()258 call void @g()259 call void @g()260 br label %bar261bar:262 %x0 = load i64, ptr %p263 %p1 = getelementptr i64, ptr %p, i64 1264 %x1 = load i64, ptr %p1265 br i1 %c0, label %baz, label %qux266baz:267 %y0 = add i64 %x0, 1268 %y1 = add i64 %x1, 1269 br label %qux270qux:271 %z0 = phi i64 [%x0, %bar], [%y0, %baz]272 %z1 = phi i64 [%x1, %bar], [%y1, %baz]273 store i64 %z0, ptr %q274 %q1 = getelementptr i64, ptr %q, i64 1275 store i64 %z1, ptr %q1276 br i1 %c1, label %foo, label %bar277}278 279 280; Should be vectorized281define void @f5(i1 %c0, ptr %p, ptr %q) {282; CHECK-LABEL: define void @f5(283; CHECK-SAME: i1 [[C0:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {284; CHECK-NEXT: [[ENTRY:.*:]]285; CHECK-NEXT: br label %[[FOO:.*]]286; CHECK: [[FOO]]:287; CHECK-NEXT: call void @g()288; CHECK-NEXT: call void @g()289; CHECK-NEXT: call void @g()290; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[P]], align 8291; CHECK-NEXT: br i1 [[C0]], label %[[BAR:.*]], label %[[FOOBAR:.*]]292; CHECK: [[BAR]]:293; CHECK-NEXT: br label %[[BAZ:.*]]294; CHECK: [[BAZ]]:295; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i64> [[TMP0]], splat (i64 1)296; CHECK-NEXT: br label %[[BARFOO:.*]]297; CHECK: [[FOOBAR]]:298; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> [[TMP0]], splat (i64 2)299; CHECK-NEXT: br label %[[BARFOO]]300; CHECK: [[BARFOO]]:301; CHECK-NEXT: [[TMP3:%.*]] = phi <2 x i64> [ [[TMP2]], %[[FOOBAR]] ], [ [[TMP1]], %[[BAZ]] ]302; CHECK-NEXT: store <2 x i64> [[TMP3]], ptr [[Q]], align 8303; CHECK-NEXT: br label %[[FOO]]304;305entry:306 br label %foo307foo:308 call void @g()309 call void @g()310 call void @g()311 %x0 = load i64, ptr %p312 %p1 = getelementptr i64, ptr %p, i64 1313 %x1 = load i64, ptr %p1314 br i1 %c0, label %bar, label %foobar315bar:316 br label %baz317baz:318 %y0 = add i64 %x0, 1319 %y1 = add i64 %x1, 1320 br label %barfoo321foobar:322 %z0 = add i64 %x0, 2323 %z1 = add i64 %x1, 2324 br label %barfoo325barfoo:326 %phi0 = phi i64 [%z0, %foobar], [%y0, %baz]327 %phi1 = phi i64 [%z1, %foobar], [%y1, %baz]328 store i64 %phi0, ptr %q329 %q1 = getelementptr i64, ptr %q, i64 1330 store i64 %phi1, ptr %q1331 br label %foo332}333 334; Shouldn't be vectorized335define void @f6(i1 %c, ptr %p, ptr %q, ptr %r) {336; CHECK-LABEL: define void @f6(337; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]], ptr [[R:%.*]]) #[[ATTR0]] {338; CHECK-NEXT: [[ENTRY:.*]]:339; CHECK-NEXT: br i1 [[C]], label %[[FOO:.*]], label %[[BAR:.*]]340; CHECK: [[FOO]]:341; CHECK-NEXT: [[X0:%.*]] = load i64, ptr [[P]], align 8342; CHECK-NEXT: [[P1:%.*]] = getelementptr i64, ptr [[P]], i64 1343; CHECK-NEXT: [[X1:%.*]] = load i64, ptr [[P1]], align 8344; CHECK-NEXT: br label %[[BAR]]345; CHECK: [[BAR]]:346; CHECK-NEXT: [[PHI0:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[X0]], %[[FOO]] ]347; CHECK-NEXT: [[PHI1:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[X1]], %[[FOO]] ]348; CHECK-NEXT: call void @g()349; CHECK-NEXT: call void @g()350; CHECK-NEXT: call void @g()351; CHECK-NEXT: br label %[[BAZ:.*]]352; CHECK: [[BAZ]]:353; CHECK-NEXT: store i64 [[PHI0]], ptr [[Q]], align 8354; CHECK-NEXT: [[Q1:%.*]] = getelementptr i64, ptr [[Q]], i64 1355; CHECK-NEXT: store i64 [[PHI1]], ptr [[Q1]], align 8356; CHECK-NEXT: ret void357;358entry:359 br i1 %c, label %foo, label %bar360foo:361 %x0 = load i64, ptr %p362 %p1 = getelementptr i64, ptr %p, i64 1363 %x1 = load i64, ptr %p1364 br label %bar365bar:366 %phi0 = phi i64 [0, %entry], [%x0, %foo]367 %phi1 = phi i64 [0, %entry], [%x1, %foo]368 call void @g()369 call void @g()370 call void @g()371 br label %baz372baz:373 store i64 %phi0, ptr %q374 %q1 = getelementptr i64, ptr %q, i64 1375 store i64 %phi1, ptr %q1376 377 ret void378}379 380