11c2ad70fSAnton Afanasyev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 23be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -S -mcpu=core-i7 | FileCheck %s 33be72f40SBjorn Pettersson; RUN: opt < %s -passes=slp-vectorizer -slp-threshold=-100 -S -mcpu=core-i7 | FileCheck %s --check-prefix=FORCE_SLP 41c2ad70fSAnton Afanasyev 5*580210a0SNikita Popovdefine <4 x i8> @test(<4 x i8> %v, ptr %x) { 6f16a9dffSAnton Afanasyev; CHECK-LABEL: @test( 7*580210a0SNikita Popov; CHECK-NEXT: [[X0:%.*]] = load i8, ptr [[X:%.*]], align 4 8*580210a0SNikita Popov; CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 1 9*580210a0SNikita Popov; CHECK-NEXT: [[X1:%.*]] = load i8, ptr [[G1]], align 4 10b7574b09SAnton Afanasyev; CHECK-NEXT: [[V0:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[X0]], i64 0 11b7574b09SAnton Afanasyev; CHECK-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i64 1 12b7574b09SAnton Afanasyev; CHECK-NEXT: [[V2:%.*]] = add <4 x i8> [[V0]], [[V1]] 131c2ad70fSAnton Afanasyev; CHECK-NEXT: ret <4 x i8> [[V2]] 141c2ad70fSAnton Afanasyev; 15f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test( 16*580210a0SNikita Popov; FORCE_SLP-NEXT: [[X0:%.*]] = load i8, ptr [[X:%.*]], align 4 17*580210a0SNikita Popov; FORCE_SLP-NEXT: [[G1:%.*]] = getelementptr inbounds i8, ptr [[X]], i64 1 18*580210a0SNikita Popov; FORCE_SLP-NEXT: [[X1:%.*]] = load i8, ptr [[G1]], align 4 19b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[V0:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[X0]], i64 0 20b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[V1:%.*]] = insertelement <4 x i8> [[V0]], i8 [[X1]], i64 1 21b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[V2:%.*]] = add <4 x i8> [[V0]], [[V1]] 22f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT: ret <4 x i8> [[V2]] 23f16a9dffSAnton Afanasyev; 24*580210a0SNikita Popov %x0 = load i8, ptr %x, align 4 25*580210a0SNikita Popov %g1 = getelementptr inbounds i8, ptr %x, i64 1 26*580210a0SNikita Popov %x1 = load i8, ptr %g1, align 4 271c2ad70fSAnton Afanasyev %v0 = insertelement <4 x i8> %v, i8 %x0, i64 0 281c2ad70fSAnton Afanasyev %v1 = insertelement <4 x i8> %v0, i8 %x1, i64 1 291c2ad70fSAnton Afanasyev %v2 = add <4 x i8> %v0, %v1 301c2ad70fSAnton Afanasyev ret <4 x i8> %v2 311c2ad70fSAnton Afanasyev} 32f16a9dffSAnton Afanasyev 33*580210a0SNikita Popovdefine <2 x i8> @test2(<2 x i8> %t6, ptr %t1) { 34f16a9dffSAnton Afanasyev; CHECK-LABEL: @test2( 35*580210a0SNikita Popov; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 36*580210a0SNikita Popov; CHECK-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 37*580210a0SNikita Popov; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 38b7574b09SAnton Afanasyev; CHECK-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 39b7574b09SAnton Afanasyev; CHECK-NEXT: [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 0 40b7574b09SAnton Afanasyev; CHECK-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 41b7574b09SAnton Afanasyev; CHECK-NEXT: [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 1 42b7574b09SAnton Afanasyev; CHECK-NEXT: [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]] 43f16a9dffSAnton Afanasyev; CHECK-NEXT: ret <2 x i8> [[T11]] 44f16a9dffSAnton Afanasyev; 45f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test2( 46*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 47*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 48*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 49b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 50b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 0 51b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 52b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 1 53b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]] 54f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT: ret <2 x i8> [[T11]] 55f16a9dffSAnton Afanasyev; 56*580210a0SNikita Popov %t3 = load i32, ptr %t1, align 4 57*580210a0SNikita Popov %t4 = getelementptr inbounds i32, ptr %t1, i64 1 58*580210a0SNikita Popov %t5 = load i32, ptr %t4, align 4 59f16a9dffSAnton Afanasyev %t7 = trunc i32 %t3 to i8 60f16a9dffSAnton Afanasyev %t8 = insertelement <2 x i8> %t6, i8 %t7, i64 0 61f16a9dffSAnton Afanasyev %t9 = trunc i32 %t5 to i8 62f16a9dffSAnton Afanasyev %t10 = insertelement <2 x i8> %t8, i8 %t9, i64 1 63f16a9dffSAnton Afanasyev %t11 = add <2 x i8> %t10, %t8 64f16a9dffSAnton Afanasyev ret <2 x i8> %t11 65f16a9dffSAnton Afanasyev} 66f16a9dffSAnton Afanasyev 67*580210a0SNikita Popovdefine <2 x i8> @test_reorder(<2 x i8> %t6, ptr %t1) { 68f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_reorder( 69*580210a0SNikita Popov; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 70*580210a0SNikita Popov; CHECK-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 71*580210a0SNikita Popov; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 72b7574b09SAnton Afanasyev; CHECK-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 73b7574b09SAnton Afanasyev; CHECK-NEXT: [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 1 74b7574b09SAnton Afanasyev; CHECK-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 75b7574b09SAnton Afanasyev; CHECK-NEXT: [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 0 76b7574b09SAnton Afanasyev; CHECK-NEXT: [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]] 77f16a9dffSAnton Afanasyev; CHECK-NEXT: ret <2 x i8> [[T11]] 78f16a9dffSAnton Afanasyev; 79f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_reorder( 80*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 81*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 82*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 83b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 84b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T8:%.*]] = insertelement <2 x i8> [[T6:%.*]], i8 [[T7]], i64 1 85b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 86b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T10:%.*]] = insertelement <2 x i8> [[T8]], i8 [[T9]], i64 0 87b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T11:%.*]] = add <2 x i8> [[T10]], [[T8]] 88f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT: ret <2 x i8> [[T11]] 89f16a9dffSAnton Afanasyev; 90*580210a0SNikita Popov %t3 = load i32, ptr %t1, align 4 91*580210a0SNikita Popov %t4 = getelementptr inbounds i32, ptr %t1, i64 1 92*580210a0SNikita Popov %t5 = load i32, ptr %t4, align 4 93f16a9dffSAnton Afanasyev %t7 = trunc i32 %t3 to i8 94f16a9dffSAnton Afanasyev %t8 = insertelement <2 x i8> %t6, i8 %t7, i64 1 95f16a9dffSAnton Afanasyev %t9 = trunc i32 %t5 to i8 96f16a9dffSAnton Afanasyev %t10 = insertelement <2 x i8> %t8, i8 %t9, i64 0 97f16a9dffSAnton Afanasyev %t11 = add <2 x i8> %t10, %t8 98f16a9dffSAnton Afanasyev ret <2 x i8> %t11 99f16a9dffSAnton Afanasyev} 100f16a9dffSAnton Afanasyev 101*580210a0SNikita Popovdefine <4 x i8> @test_subvector(<4 x i8> %t6, ptr %t1) { 102f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_subvector( 103*580210a0SNikita Popov; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 104*580210a0SNikita Popov; CHECK-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 105*580210a0SNikita Popov; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 106b7574b09SAnton Afanasyev; CHECK-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 107b7574b09SAnton Afanasyev; CHECK-NEXT: [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 0 108b7574b09SAnton Afanasyev; CHECK-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 109b7574b09SAnton Afanasyev; CHECK-NEXT: [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 1 110b7574b09SAnton Afanasyev; CHECK-NEXT: [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]] 111f16a9dffSAnton Afanasyev; CHECK-NEXT: ret <4 x i8> [[T11]] 112f16a9dffSAnton Afanasyev; 113f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_subvector( 114*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 115*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 116*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 117b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 118b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 0 119b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 120b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 1 121b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]] 122f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT: ret <4 x i8> [[T11]] 123f16a9dffSAnton Afanasyev; 124*580210a0SNikita Popov %t3 = load i32, ptr %t1, align 4 125*580210a0SNikita Popov %t4 = getelementptr inbounds i32, ptr %t1, i64 1 126*580210a0SNikita Popov %t5 = load i32, ptr %t4, align 4 127f16a9dffSAnton Afanasyev %t7 = trunc i32 %t3 to i8 128f16a9dffSAnton Afanasyev %t8 = insertelement <4 x i8> %t6, i8 %t7, i64 0 129f16a9dffSAnton Afanasyev %t9 = trunc i32 %t5 to i8 130f16a9dffSAnton Afanasyev %t10 = insertelement <4 x i8> %t8, i8 %t9, i64 1 131f16a9dffSAnton Afanasyev %t11 = add <4 x i8> %t10, %t8 132f16a9dffSAnton Afanasyev ret <4 x i8> %t11 133f16a9dffSAnton Afanasyev} 134f16a9dffSAnton Afanasyev 135*580210a0SNikita Popovdefine <4 x i8> @test_subvector_reorder(<4 x i8> %t6, ptr %t1) { 136f16a9dffSAnton Afanasyev; CHECK-LABEL: @test_subvector_reorder( 137*580210a0SNikita Popov; CHECK-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 138*580210a0SNikita Popov; CHECK-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 139*580210a0SNikita Popov; CHECK-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 140b7574b09SAnton Afanasyev; CHECK-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 141b7574b09SAnton Afanasyev; CHECK-NEXT: [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 3 142b7574b09SAnton Afanasyev; CHECK-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 143b7574b09SAnton Afanasyev; CHECK-NEXT: [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 2 144b7574b09SAnton Afanasyev; CHECK-NEXT: [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]] 145f16a9dffSAnton Afanasyev; CHECK-NEXT: ret <4 x i8> [[T11]] 146f16a9dffSAnton Afanasyev; 147f16a9dffSAnton Afanasyev; FORCE_SLP-LABEL: @test_subvector_reorder( 148*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T3:%.*]] = load i32, ptr [[T1:%.*]], align 4 149*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T4:%.*]] = getelementptr inbounds i32, ptr [[T1]], i64 1 150*580210a0SNikita Popov; FORCE_SLP-NEXT: [[T5:%.*]] = load i32, ptr [[T4]], align 4 151b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T7:%.*]] = trunc i32 [[T3]] to i8 152b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T8:%.*]] = insertelement <4 x i8> [[T6:%.*]], i8 [[T7]], i64 3 153b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T9:%.*]] = trunc i32 [[T5]] to i8 154b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T10:%.*]] = insertelement <4 x i8> [[T8]], i8 [[T9]], i64 2 155b7574b09SAnton Afanasyev; FORCE_SLP-NEXT: [[T11:%.*]] = add <4 x i8> [[T10]], [[T8]] 156f16a9dffSAnton Afanasyev; FORCE_SLP-NEXT: ret <4 x i8> [[T11]] 157f16a9dffSAnton Afanasyev; 158*580210a0SNikita Popov %t3 = load i32, ptr %t1, align 4 159*580210a0SNikita Popov %t4 = getelementptr inbounds i32, ptr %t1, i64 1 160*580210a0SNikita Popov %t5 = load i32, ptr %t4, align 4 161f16a9dffSAnton Afanasyev %t7 = trunc i32 %t3 to i8 162f16a9dffSAnton Afanasyev %t8 = insertelement <4 x i8> %t6, i8 %t7, i64 3 163f16a9dffSAnton Afanasyev %t9 = trunc i32 %t5 to i8 164f16a9dffSAnton Afanasyev %t10 = insertelement <4 x i8> %t8, i8 %t9, i64 2 165f16a9dffSAnton Afanasyev %t11 = add <4 x i8> %t10, %t8 166f16a9dffSAnton Afanasyev ret <4 x i8> %t11 167f16a9dffSAnton Afanasyev} 168