|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 2 | +; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -slp-threshold=-100 < %s | FileCheck %s |
| 3 | + |
| 4 | +define void @test(i32 %j.6, i32 %m.4, i8 %v.5, ptr %a, i1 %tobool14.not) { |
| 5 | +; CHECK-LABEL: define void @test( |
| 6 | +; CHECK-SAME: i32 [[J_6:%.*]], i32 [[M_4:%.*]], i8 [[V_5:%.*]], ptr [[A:%.*]], i1 [[TOBOOL14_NOT:%.*]]) { |
| 7 | +; CHECK-NEXT: [[ENTRY:.*]]: |
| 8 | +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i8> <i8 0, i8 poison>, i8 [[V_5]], i32 1 |
| 9 | +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> <i32 poison, i32 poison, i32 1, i32 poison>, i32 [[M_4]], i32 1 |
| 10 | +; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[J_6]], i32 3 |
| 11 | +; CHECK-NEXT: br label %[[N:.*]] |
| 12 | +; CHECK: [[ENTRY_O_CRIT_EDGE:.*]]: |
| 13 | +; CHECK-NEXT: br label %[[O:.*]] |
| 14 | +; CHECK: [[N]]: |
| 15 | +; CHECK-NEXT: [[J_0:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[J_6]], %[[IF_END18:.*]] ] |
| 16 | +; CHECK-NEXT: [[L_0:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ [[L_4:%.*]], %[[IF_END18]] ] |
| 17 | +; CHECK-NEXT: [[TMP3:%.*]] = phi <4 x i32> [ zeroinitializer, %[[ENTRY]] ], [ [[TMP37:%.*]], %[[IF_END18]] ] |
| 18 | +; CHECK-NEXT: store i32 [[J_0]], ptr [[A]], align 4 |
| 19 | +; CHECK-NEXT: [[CMP_NOT_NOT:%.*]] = icmp eq i8 [[L_0]], 0 |
| 20 | +; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 1, i32 poison, i32 3> |
| 21 | +; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 poison, i32 1, i32 0, i32 0, i32 poison, i32 0, i32 poison>, <8 x i32> <i32 8, i32 poison, i32 10, i32 11, i32 12, i32 1, i32 14, i32 3> |
| 22 | +; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[TMP5]], <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 10, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> |
| 23 | +; CHECK-NEXT: br i1 [[CMP_NOT_NOT]], label %[[O_SINK_SPLIT:.*]], label %[[P:.*]] |
| 24 | +; CHECK: [[P]]: |
| 25 | +; CHECK-NEXT: [[TMP7:%.*]] = phi <2 x i8> [ <i8 1, i8 0>, %[[IF_END18]] ], [ [[TMP0]], %[[N]] ] |
| 26 | +; CHECK-NEXT: [[TMP8:%.*]] = phi <8 x i32> [ [[TMP35:%.*]], %[[IF_END18]] ], [ [[TMP6]], %[[N]] ] |
| 27 | +; CHECK-NEXT: [[TMP9:%.*]] = extractelement <8 x i32> [[TMP8]], i32 7 |
| 28 | +; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 5, i32 6> |
| 29 | +; CHECK-NEXT: [[TMP11:%.*]] = icmp eq <2 x i32> [[TMP10]], zeroinitializer |
| 30 | +; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i1> [[TMP11]], i32 0 |
| 31 | +; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP12]], i32 [[TMP9]], i32 0 |
| 32 | +; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i8> [[TMP7]], i32 0 |
| 33 | +; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i8> [[TMP7]], i32 1 |
| 34 | +; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <2 x i32> <i32 0, i32 3> |
| 35 | +; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <4 x i32> <i32 poison, i32 1, i32 poison, i32 poison> |
| 36 | +; CHECK-NEXT: [[TMP17:%.*]] = shufflevector <8 x i32> <i32 1, i32 0, i32 poison, i32 poison, i32 undef, i32 undef, i32 undef, i32 undef>, <8 x i32> [[TMP8]], <4 x i32> <i32 0, i32 1, i32 9, i32 poison> |
| 37 | +; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x i32> [[TMP17]], i32 [[SPEC_SELECT]], i32 3 |
| 38 | +; CHECK-NEXT: [[TMP19:%.*]] = extractelement <8 x i32> [[TMP8]], i32 2 |
| 39 | +; CHECK-NEXT: [[TMP20:%.*]] = extractelement <8 x i32> [[TMP8]], i32 4 |
| 40 | +; CHECK-NEXT: [[TMP21:%.*]] = extractelement <2 x i1> [[TMP11]], i32 1 |
| 41 | +; CHECK-NEXT: br i1 [[TMP21]], label %[[O_SINK_SPLIT]], label %[[Q:.*]] |
| 42 | +; CHECK: [[O_SINK_SPLIT]]: |
| 43 | +; CHECK-NEXT: [[SPEC_SELECT_SINK:%.*]] = phi i32 [ [[J_0]], %[[N]] ], [ [[SPEC_SELECT]], %[[P]] ] |
| 44 | +; CHECK-NEXT: [[I_3_PH:%.*]] = phi i32 [ 0, %[[N]] ], [ [[TMP19]], %[[P]] ] |
| 45 | +; CHECK-NEXT: [[L_3_PH:%.*]] = phi i8 [ 0, %[[N]] ], [ [[TMP13]], %[[P]] ] |
| 46 | +; CHECK-NEXT: [[TMP22:%.*]] = phi <4 x i32> [ [[TMP3]], %[[N]] ], [ [[TMP18]], %[[P]] ] |
| 47 | +; CHECK-NEXT: [[CONV10:%.*]] = zext i32 [[SPEC_SELECT_SINK]] to i64 |
| 48 | +; CHECK-NEXT: [[CALL11:%.*]] = tail call i32 (ptr, ...) @printf(ptr null, i64 [[CONV10]]) |
| 49 | +; CHECK-NEXT: br label %[[O]] |
| 50 | +; CHECK: [[O]]: |
| 51 | +; CHECK-NEXT: [[TMP23:%.*]] = phi <4 x i32> [ poison, %[[ENTRY_O_CRIT_EDGE]] ], [ [[TMP22]], %[[O_SINK_SPLIT]] ] |
| 52 | +; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[J_6]] |
| 53 | +; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], [[I_3_PH]] |
| 54 | +; CHECK-NEXT: [[SUB13:%.*]] = sub i32 0, [[DIV]] |
| 55 | +; CHECK-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> poison, i32 [[SUB]], i32 0 |
| 56 | +; CHECK-NEXT: [[TMP25:%.*]] = insertelement <4 x i32> [[TMP24]], i32 [[SUB13]], i32 1 |
| 57 | +; CHECK-NEXT: [[TMP26:%.*]] = shufflevector <4 x i32> [[TMP25]], <4 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1> |
| 58 | +; CHECK-NEXT: [[TMP27:%.*]] = shufflevector <4 x i32> [[TMP26]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> |
| 59 | +; CHECK-NEXT: [[TMP28:%.*]] = call <8 x i32> @llvm.vector.insert.v8i32.v4i32(<8 x i32> [[TMP27]], <4 x i32> [[TMP23]], i64 4) |
| 60 | +; CHECK-NEXT: [[TMP29:%.*]] = shufflevector <8 x i32> [[TMP28]], <8 x i32> poison, <2 x i32> <i32 poison, i32 6> |
| 61 | +; CHECK-NEXT: [[TMP30:%.*]] = shufflevector <2 x i32> [[TMP29]], <2 x i32> <i32 0, i32 poison>, <2 x i32> <i32 2, i32 1> |
| 62 | +; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[IF_END18]], label %[[Q]] |
| 63 | +; CHECK: [[Q]]: |
| 64 | +; CHECK-NEXT: [[U_4:%.*]] = phi i32 [ [[TMP20]], %[[P]] ], [ 0, %[[O]] ] |
| 65 | +; CHECK-NEXT: [[V_44:%.*]] = phi i8 [ [[TMP14]], %[[P]] ], [ 0, %[[O]] ] |
| 66 | +; CHECK-NEXT: [[TMP31:%.*]] = phi <2 x i32> [ [[TMP15]], %[[P]] ], [ [[TMP30]], %[[O]] ] |
| 67 | +; CHECK-NEXT: [[TMP32:%.*]] = shufflevector <2 x i32> [[TMP31]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1> |
| 68 | +; CHECK-NEXT: [[CONV17:%.*]] = sext i8 [[V_44]] to i32 |
| 69 | +; CHECK-NEXT: [[REM:%.*]] = mul i32 [[U_4]], [[CONV17]] |
| 70 | +; CHECK-NEXT: [[TMP33:%.*]] = insertelement <8 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 poison, i32 0, i32 0>, i32 [[REM]], i32 5 |
| 71 | +; CHECK-NEXT: [[TMP34:%.*]] = call <8 x i32> @llvm.vector.insert.v8i32.v4i32(<8 x i32> [[TMP33]], <4 x i32> [[TMP32]], i64 0) |
| 72 | +; CHECK-NEXT: br label %[[IF_END18]] |
| 73 | +; CHECK: [[IF_END18]]: |
| 74 | +; CHECK-NEXT: [[L_4]] = phi i8 [ 0, %[[Q]] ], [ [[L_3_PH]], %[[O]] ] |
| 75 | +; CHECK-NEXT: [[TMP35]] = phi <8 x i32> [ [[TMP34]], %[[Q]] ], [ [[TMP28]], %[[O]] ] |
| 76 | +; CHECK-NEXT: [[TMP36:%.*]] = shufflevector <8 x i32> [[TMP35]], <8 x i32> poison, <4 x i32> <i32 4, i32 poison, i32 poison, i32 poison> |
| 77 | +; CHECK-NEXT: [[TMP37]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> [[TMP36]], <4 x i32> <i32 4, i32 1, i32 2, i32 3> |
| 78 | +; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[N]], label %[[P]] |
| 79 | +; |
| 80 | +entry: |
| 81 | + br label %n |
| 82 | + |
| 83 | +entry.o_crit_edge: |
| 84 | + br label %o |
| 85 | + |
| 86 | +n: |
| 87 | + %i.0 = phi i32 [ 0, %entry ], [ 1, %if.end18 ] |
| 88 | + %j.0 = phi i32 [ 0, %entry ], [ %j.6, %if.end18 ] |
| 89 | + %m.0 = phi i32 [ 0, %entry ], [ %m.4, %if.end18 ] |
| 90 | + %l.0 = phi i8 [ 0, %entry ], [ %l.4, %if.end18 ] |
| 91 | + %u.0 = phi i32 [ 0, %entry ], [ %u.5, %if.end18 ] |
| 92 | + store i32 %j.0, ptr %a, align 4 |
| 93 | + %cmp.not.not = icmp eq i8 %l.0, 0 |
| 94 | + br i1 %cmp.not.not, label %o.sink.split, label %p |
| 95 | + |
| 96 | +p: |
| 97 | + %0 = phi i32 [ %r.3, %if.end18 ], [ 0, %n ] |
| 98 | + %i.1 = phi i32 [ %s.3, %if.end18 ], [ 1, %n ] |
| 99 | + %j.1 = phi i32 [ %j.65, %if.end18 ], [ %j.0, %n ] |
| 100 | + %k.1 = phi i32 [ %t.3, %if.end18 ], [ %i.0, %n ] |
| 101 | + %m.1 = phi i32 [ %m.46, %if.end18 ], [ %m.0, %n ] |
| 102 | + %l.1 = phi i8 [ 1, %if.end18 ], [ 0, %n ] |
| 103 | + %s.1 = phi i32 [ %s.3, %if.end18 ], [ 0, %n ] |
| 104 | + %t.1 = phi i32 [ %t.3, %if.end18 ], [ 0, %n ] |
| 105 | + %u.12 = phi i32 [ %u.5, %if.end18 ], [ 0, %n ] |
| 106 | + %v.1 = phi i8 [ 0, %if.end18 ], [ %v.5, %n ] |
| 107 | + %tobool4.not = icmp eq i32 %m.1, 0 |
| 108 | + %spec.select = select i1 %tobool4.not, i32 %j.1, i32 0 |
| 109 | + %tobool7.not = icmp eq i32 %0, 0 |
| 110 | + br i1 %tobool7.not, label %o.sink.split, label %q |
| 111 | + |
| 112 | +o.sink.split: |
| 113 | + %spec.select.sink = phi i32 [ %j.0, %n ], [ %spec.select, %p ] |
| 114 | + %i.3.ph = phi i32 [ 0, %n ], [ %i.1, %p ] |
| 115 | + %k.3.ph = phi i32 [ %i.0, %n ], [ %k.1, %p ] |
| 116 | + %m.3.ph = phi i32 [ %m.0, %n ], [ 0, %p ] |
| 117 | + %l.3.ph = phi i8 [ 0, %n ], [ %l.1, %p ] |
| 118 | + %u.3.ph = phi i32 [ %u.0, %n ], [ 1, %p ] |
| 119 | + %conv10 = zext i32 %spec.select.sink to i64 |
| 120 | + %call11 = tail call i32 (ptr, ...) @printf(ptr null, i64 %conv10) |
| 121 | + br label %o |
| 122 | + |
| 123 | +o: |
| 124 | + %j.4 = phi i32 [ 0, %entry.o_crit_edge ], [ %spec.select.sink, %o.sink.split ] |
| 125 | + %k.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %k.3.ph, %o.sink.split ] |
| 126 | + %m.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %m.3.ph, %o.sink.split ] |
| 127 | + %u.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %u.3.ph, %o.sink.split ] |
| 128 | + %sub = sub i32 0, %j.6 |
| 129 | + %div = sdiv i32 %sub, %i.3.ph |
| 130 | + %sub13 = sub i32 0, %div |
| 131 | + br i1 %tobool14.not, label %if.end18, label %q |
| 132 | + |
| 133 | +q: |
| 134 | + %s.2 = phi i32 [ %s.1, %p ], [ 0, %o ] |
| 135 | + %t.2 = phi i32 [ %t.1, %p ], [ %k.3, %o ] |
| 136 | + %u.4 = phi i32 [ %u.12, %p ], [ 0, %o ] |
| 137 | + %v.44 = phi i8 [ %v.1, %p ], [ 0, %o ] |
| 138 | + %conv17 = sext i8 %v.44 to i32 |
| 139 | + %rem = mul i32 %u.4, %conv17 |
| 140 | + br label %if.end18 |
| 141 | + |
| 142 | +if.end18: |
| 143 | + %j.65 = phi i32 [ 0, %q ], [ %j.4, %o ] |
| 144 | + %m.46 = phi i32 [ %rem, %q ], [ %m.3, %o ] |
| 145 | + %l.4 = phi i8 [ 0, %q ], [ %l.3.ph, %o ] |
| 146 | + %r.3 = phi i32 [ 0, %q ], [ %k.3, %o ] |
| 147 | + %s.3 = phi i32 [ %s.2, %q ], [ %sub, %o ] |
| 148 | + %t.3 = phi i32 [ %t.2, %q ], [ %sub13, %o ] |
| 149 | + %u.5 = phi i32 [ 0, %q ], [ %u.3, %o ] |
| 150 | + br i1 %tobool14.not, label %n, label %p |
| 151 | + |
| 152 | +} |
| 153 | +declare i32 @printf(ptr, ...) |
0 commit comments