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=-1000 < %s | FileCheck %s 3 4define void @e(ptr %c, i64 %0) { 5; CHECK-LABEL: define void @e( 6; CHECK-SAME: ptr [[C:%.*]], i64 [[TMP0:%.*]]) { 7; CHECK-NEXT: [[ENTRY:.*:]] 8; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[C]], align 8 9; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[TMP1]], i64 96 10; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr i8, ptr [[TMP1]], i64 104 11; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8 12; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[C]], align 8 13; CHECK-NEXT: [[TMP18:%.*]] = load <2 x ptr>, ptr [[ARRAYIDX5]], align 8 14; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <2 x ptr> [[TMP18]], <2 x ptr> poison, <2 x i32> <i32 1, i32 0> 15; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x ptr> poison, ptr [[TMP3]], i32 0 16; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x ptr> [[TMP5]], <2 x ptr> poison, <2 x i32> zeroinitializer 17; CHECK-NEXT: [[TMP7:%.*]] = insertelement <6 x ptr> poison, ptr [[TMP2]], i32 2 18; CHECK-NEXT: [[TMP8:%.*]] = insertelement <6 x ptr> [[TMP7]], ptr [[TMP1]], i32 3 19; CHECK-NEXT: [[TMP9:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP8]], <2 x ptr> [[TMP4]], i64 0) 20; CHECK-NEXT: [[TMP10:%.*]] = call <6 x ptr> @llvm.vector.insert.v6p0.v2p0(<6 x ptr> [[TMP9]], <2 x ptr> [[TMP6]], i64 4) 21; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint <6 x ptr> [[TMP10]] to <6 x i64> 22; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <6 x i64> [[TMP11]], <6 x i64> poison, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3, i32 3, i32 4, i32 4, i32 4, i32 4, i32 5, i32 5, i32 5> 23; CHECK-NEXT: [[TMP13:%.*]] = insertelement <32 x i64> poison, i64 [[TMP0]], i32 0 24; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <32 x i64> [[TMP13]], <32 x i64> poison, <32 x i32> zeroinitializer 25; CHECK-NEXT: [[TMP15:%.*]] = or <32 x i64> [[TMP14]], [[TMP12]] 26; CHECK-NEXT: [[TMP16:%.*]] = icmp ult <32 x i64> [[TMP15]], splat (i64 16) 27; CHECK-NEXT: [[TMP17:%.*]] = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> [[TMP16]]) 28; CHECK-NEXT: br i1 [[TMP17]], label %[[FOR_BODY:.*]], label %[[VECTOR_PH:.*]] 29; CHECK: [[VECTOR_PH]]: 30; CHECK-NEXT: ret void 31; CHECK: [[FOR_BODY]]: 32; CHECK-NEXT: ret void 33; 34entry: 35 %1 = load ptr, ptr %c, align 8 36 %arrayidx = getelementptr i8, ptr %1, i64 96 37 %arrayidx1 = getelementptr i8, ptr %1, i64 112 38 %2 = load ptr, ptr %arrayidx1, align 8 39 %arrayidx5 = getelementptr i8, ptr %1, i64 104 40 %3 = load ptr, ptr %arrayidx5, align 8 41 %4 = load ptr, ptr %arrayidx, align 8 42 %5 = load ptr, ptr %c, align 8 43 %6 = ptrtoint ptr %5 to i64 44 %7 = ptrtoint ptr %5 to i64 45 %8 = ptrtoint ptr %1 to i64 46 %9 = ptrtoint ptr %4 to i64 47 %10 = ptrtoint ptr %3 to i64 48 %11 = ptrtoint ptr %2 to i64 49 %12 = or i64 %0, %11 50 %dc64 = icmp ult i64 %12, 16 51 %13 = or i64 %0, %11 52 %dc65 = icmp ult i64 %13, 16 53 %cr66 = or i1 %dc64, %dc65 54 %14 = or i64 %0, %11 55 %dc67 = icmp ult i64 %14, 16 56 %cr68 = or i1 %cr66, %dc67 57 %15 = or i64 %0, %11 58 %dc69 = icmp ult i64 %15, 16 59 %cr70 = or i1 %cr68, %dc69 60 %16 = or i64 %0, %11 61 %dc71 = icmp ult i64 %16, 16 62 %cr72 = or i1 %cr70, %dc71 63 %17 = or i64 %0, %11 64 %dc73 = icmp ult i64 %17, 16 65 %cr74 = or i1 %cr72, %dc73 66 %18 = or i64 %0, %11 67 %dc75 = icmp ult i64 %18, 16 68 %cr76 = or i1 %cr74, %dc75 69 %19 = or i64 %0, %10 70 %dc77 = icmp ult i64 %19, 16 71 %cr78 = or i1 %cr76, %dc77 72 %20 = or i64 %0, %10 73 %dc79 = icmp ult i64 %20, 16 74 %cr80 = or i1 %cr78, %dc79 75 %21 = or i64 %0, %10 76 %dc81 = icmp ult i64 %21, 16 77 %cr82 = or i1 %cr80, %dc81 78 %22 = or i64 %0, %10 79 %dc83 = icmp ult i64 %22, 16 80 %cr84 = or i1 %cr82, %dc83 81 %23 = or i64 %0, %10 82 %dc85 = icmp ult i64 %23, 16 83 %cr86 = or i1 %cr84, %dc85 84 %24 = or i64 %0, %10 85 %dc87 = icmp ult i64 %24, 16 86 %cr88 = or i1 %cr86, %dc87 87 %25 = or i64 %0, %10 88 %dc89 = icmp ult i64 %25, 16 89 %cr90 = or i1 %cr88, %dc89 90 %26 = or i64 %0, %9 91 %dc91 = icmp ult i64 %26, 16 92 %cr92 = or i1 %cr90, %dc91 93 %27 = or i64 %0, %9 94 %dc93 = icmp ult i64 %27, 16 95 %cr94 = or i1 %cr92, %dc93 96 %28 = or i64 %0, %9 97 %dc95 = icmp ult i64 %28, 16 98 %cr96 = or i1 %cr94, %dc95 99 %29 = or i64 %0, %9 100 %dc97 = icmp ult i64 %29, 16 101 %cr98 = or i1 %cr96, %dc97 102 %30 = or i64 %0, %9 103 %dc99 = icmp ult i64 %30, 16 104 %cr100 = or i1 %cr98, %dc99 105 %31 = or i64 %0, %9 106 %dc101 = icmp ult i64 %31, 16 107 %cr102 = or i1 %cr100, %dc101 108 %32 = or i64 %0, %8 109 %dc103 = icmp ult i64 %32, 16 110 %cr104 = or i1 %cr102, %dc103 111 %33 = or i64 %0, %8 112 %dc105 = icmp ult i64 %33, 16 113 %cr106 = or i1 %cr104, %dc105 114 %34 = or i64 %0, %8 115 %dc107 = icmp ult i64 %34, 16 116 %cr108 = or i1 %cr106, %dc107 117 %35 = or i64 %0, %8 118 %dc109 = icmp ult i64 %35, 16 119 %cr110 = or i1 %cr108, %dc109 120 %36 = or i64 %0, %8 121 %dc111 = icmp ult i64 %36, 16 122 %cr112 = or i1 %cr110, %dc111 123 %37 = or i64 %0, %7 124 %dc113 = icmp ult i64 %37, 16 125 %cr114 = or i1 %cr112, %dc113 126 %38 = or i64 %0, %7 127 %dc115 = icmp ult i64 %38, 16 128 %cr116 = or i1 %cr114, %dc115 129 %39 = or i64 %0, %7 130 %dc117 = icmp ult i64 %39, 16 131 %cr118 = or i1 %cr116, %dc117 132 %40 = or i64 %0, %7 133 %dc119 = icmp ult i64 %40, 16 134 %cr120 = or i1 %cr118, %dc119 135 %41 = or i64 %0, %6 136 %dc121 = icmp ult i64 %41, 16 137 %cr122 = or i1 %cr120, %dc121 138 %42 = or i64 %0, %6 139 %dc123 = icmp ult i64 %42, 16 140 %cr124 = or i1 %cr122, %dc123 141 %43 = or i64 %0, %6 142 %dc125 = icmp ult i64 %43, 16 143 %cr126 = or i1 %cr124, %dc125 144 br i1 %cr126, label %for.body, label %vector.ph 145 146vector.ph: 147 ret void 148 149for.body: 150 ret void 151} 152