157 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu -slp-threshold=-100 < %s | FileCheck %s3 4define 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 19; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> <i32 poison, i32 poison, i32 1, i32 poison>, i32 [[M_4]], i32 110; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[J_6]], i32 311; 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 419; CHECK-NEXT: [[CMP_NOT_NOT:%.*]] = icmp eq i8 [[L_0]], 020; 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 728; 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]], zeroinitializer30; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i1> [[TMP11]], i32 031; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP12]], i32 [[TMP9]], i32 032; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i8> [[TMP7]], i32 033; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x i8> [[TMP7]], i32 134; 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 338; CHECK-NEXT: [[TMP19:%.*]] = extractelement <8 x i32> [[TMP8]], i32 239; CHECK-NEXT: [[TMP20:%.*]] = extractelement <8 x i32> [[TMP8]], i32 440; CHECK-NEXT: [[TMP21:%.*]] = extractelement <2 x i1> [[TMP11]], i32 141; 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 i6448; 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 056; CHECK-NEXT: [[TMP25:%.*]] = insertelement <4 x i32> [[TMP24]], i32 [[SUB13]], i32 157; 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: [[TMP34:%.*]] = shufflevector <4 x i32> [[TMP23]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>60; CHECK-NEXT: [[TMP28:%.*]] = shufflevector <8 x i32> [[TMP27]], <8 x i32> [[TMP34]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>61; CHECK-NEXT: [[TMP29:%.*]] = shufflevector <8 x i32> [[TMP28]], <8 x i32> poison, <2 x i32> <i32 poison, i32 6>62; CHECK-NEXT: [[TMP30:%.*]] = shufflevector <2 x i32> [[TMP29]], <2 x i32> <i32 0, i32 poison>, <2 x i32> <i32 2, i32 1>63; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[IF_END18]], label %[[Q]]64; CHECK: [[Q]]:65; CHECK-NEXT: [[U_4:%.*]] = phi i32 [ [[TMP20]], %[[P]] ], [ 0, %[[O]] ]66; CHECK-NEXT: [[V_44:%.*]] = phi i8 [ [[TMP14]], %[[P]] ], [ 0, %[[O]] ]67; CHECK-NEXT: [[TMP31:%.*]] = phi <2 x i32> [ [[TMP15]], %[[P]] ], [ [[TMP30]], %[[O]] ]68; CHECK-NEXT: [[TMP32:%.*]] = shufflevector <2 x i32> [[TMP31]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>69; CHECK-NEXT: [[CONV17:%.*]] = sext i8 [[V_44]] to i3270; CHECK-NEXT: [[REM:%.*]] = mul i32 [[U_4]], [[CONV17]]71; 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 572; CHECK-NEXT: [[TMP38:%.*]] = shufflevector <4 x i32> [[TMP32]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>73; CHECK-NEXT: [[TMP39:%.*]] = shufflevector <2 x i32> [[TMP31]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>74; CHECK-NEXT: [[TMP40:%.*]] = shufflevector <8 x i32> [[TMP33]], <8 x i32> [[TMP39]], <8 x i32> <i32 8, i32 9, i32 8, i32 9, i32 4, i32 5, i32 6, i32 7>75; CHECK-NEXT: br label %[[IF_END18]]76; CHECK: [[IF_END18]]:77; CHECK-NEXT: [[L_4]] = phi i8 [ 0, %[[Q]] ], [ [[L_3_PH]], %[[O]] ]78; CHECK-NEXT: [[TMP35]] = phi <8 x i32> [ [[TMP40]], %[[Q]] ], [ [[TMP28]], %[[O]] ]79; CHECK-NEXT: [[TMP36:%.*]] = shufflevector <8 x i32> [[TMP35]], <8 x i32> poison, <4 x i32> <i32 4, i32 poison, i32 poison, i32 poison>80; CHECK-NEXT: [[TMP37]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> [[TMP36]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>81; CHECK-NEXT: br i1 [[TOBOOL14_NOT]], label %[[N]], label %[[P]]82;83entry:84 br label %n85 86entry.o_crit_edge:87 br label %o88 89n:90 %i.0 = phi i32 [ 0, %entry ], [ 1, %if.end18 ]91 %j.0 = phi i32 [ 0, %entry ], [ %j.6, %if.end18 ]92 %m.0 = phi i32 [ 0, %entry ], [ %m.4, %if.end18 ]93 %l.0 = phi i8 [ 0, %entry ], [ %l.4, %if.end18 ]94 %u.0 = phi i32 [ 0, %entry ], [ %u.5, %if.end18 ]95 store i32 %j.0, ptr %a, align 496 %cmp.not.not = icmp eq i8 %l.0, 097 br i1 %cmp.not.not, label %o.sink.split, label %p98 99p:100 %0 = phi i32 [ %r.3, %if.end18 ], [ 0, %n ]101 %i.1 = phi i32 [ %s.3, %if.end18 ], [ 1, %n ]102 %j.1 = phi i32 [ %j.65, %if.end18 ], [ %j.0, %n ]103 %k.1 = phi i32 [ %t.3, %if.end18 ], [ %i.0, %n ]104 %m.1 = phi i32 [ %m.46, %if.end18 ], [ %m.0, %n ]105 %l.1 = phi i8 [ 1, %if.end18 ], [ 0, %n ]106 %s.1 = phi i32 [ %s.3, %if.end18 ], [ 0, %n ]107 %t.1 = phi i32 [ %t.3, %if.end18 ], [ 0, %n ]108 %u.12 = phi i32 [ %u.5, %if.end18 ], [ 0, %n ]109 %v.1 = phi i8 [ 0, %if.end18 ], [ %v.5, %n ]110 %tobool4.not = icmp eq i32 %m.1, 0111 %spec.select = select i1 %tobool4.not, i32 %j.1, i32 0112 %tobool7.not = icmp eq i32 %0, 0113 br i1 %tobool7.not, label %o.sink.split, label %q114 115o.sink.split:116 %spec.select.sink = phi i32 [ %j.0, %n ], [ %spec.select, %p ]117 %i.3.ph = phi i32 [ 0, %n ], [ %i.1, %p ]118 %k.3.ph = phi i32 [ %i.0, %n ], [ %k.1, %p ]119 %m.3.ph = phi i32 [ %m.0, %n ], [ 0, %p ]120 %l.3.ph = phi i8 [ 0, %n ], [ %l.1, %p ]121 %u.3.ph = phi i32 [ %u.0, %n ], [ 1, %p ]122 %conv10 = zext i32 %spec.select.sink to i64123 %call11 = tail call i32 (ptr, ...) @printf(ptr null, i64 %conv10)124 br label %o125 126o:127 %j.4 = phi i32 [ 0, %entry.o_crit_edge ], [ %spec.select.sink, %o.sink.split ]128 %k.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %k.3.ph, %o.sink.split ]129 %m.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %m.3.ph, %o.sink.split ]130 %u.3 = phi i32 [ 0, %entry.o_crit_edge ], [ %u.3.ph, %o.sink.split ]131 %sub = sub i32 0, %j.6132 %div = sdiv i32 %sub, %i.3.ph133 %sub13 = sub i32 0, %div134 br i1 %tobool14.not, label %if.end18, label %q135 136q:137 %s.2 = phi i32 [ %s.1, %p ], [ 0, %o ]138 %t.2 = phi i32 [ %t.1, %p ], [ %k.3, %o ]139 %u.4 = phi i32 [ %u.12, %p ], [ 0, %o ]140 %v.44 = phi i8 [ %v.1, %p ], [ 0, %o ]141 %conv17 = sext i8 %v.44 to i32142 %rem = mul i32 %u.4, %conv17143 br label %if.end18144 145if.end18:146 %j.65 = phi i32 [ 0, %q ], [ %j.4, %o ]147 %m.46 = phi i32 [ %rem, %q ], [ %m.3, %o ]148 %l.4 = phi i8 [ 0, %q ], [ %l.3.ph, %o ]149 %r.3 = phi i32 [ 0, %q ], [ %k.3, %o ]150 %s.3 = phi i32 [ %s.2, %q ], [ %sub, %o ]151 %t.3 = phi i32 [ %t.2, %q ], [ %sub13, %o ]152 %u.5 = phi i32 [ 0, %q ], [ %u.3, %o ]153 br i1 %tobool14.not, label %n, label %p154 155}156declare i32 @printf(ptr, ...)157