brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.8 KiB · a07bbf9 Raw
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