brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 22a007d Raw
114 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' < %s | FileCheck %s3 4target datalayout =5"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"6target triple = "x86_64-unknown-linux-gnu"7 8%struct.a = type { i32, i32 }9@c = external dso_local global %struct.a, align 410@glob_array = internal unnamed_addr constant [16 x i32] [i32 1, i32 1, i32 2, i32 3, i32 5, i32 8, i32 13, i32 21, i32 34, i32 55, i32 89, i32 144, i32 233, i32 377, i32 610, i32 987], align 1611 12define <4 x i32> @splat_base(ptr %base, <4 x i64> %index) {13; CHECK-LABEL: @splat_base(14; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], <4 x i64> [[INDEX:%.*]]15; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP1]], <4 x i1> splat (i1 true), <4 x i32> undef)16; CHECK-NEXT:    ret <4 x i32> [[RES]]17;18  %broadcast.splatinsert = insertelement <4 x ptr> undef, ptr %base, i32 019  %broadcast.splat = shufflevector <4 x ptr> %broadcast.splatinsert, <4 x ptr> undef, <4 x i32> zeroinitializer20  %gep = getelementptr i32, <4 x ptr> %broadcast.splat, <4 x i64> %index21  %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %gep, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)22  ret <4 x i32> %res23}24 25define <4 x i32> @splat_struct(ptr %base) {26; CHECK-LABEL: @splat_struct(27; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_A:%.*]], ptr [[BASE:%.*]], i64 0, i32 128; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[TMP1]], <4 x i64> zeroinitializer29; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP2]], <4 x i1> splat (i1 true), <4 x i32> undef)30; CHECK-NEXT:    ret <4 x i32> [[RES]]31;32  %gep = getelementptr %struct.a, ptr %base, <4 x i64> zeroinitializer, i32 133  %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %gep, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)34  ret <4 x i32> %res35}36 37define <4 x i32> @scalar_index(ptr %base, i64 %index) {38; CHECK-LABEL: @scalar_index(39; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[INDEX:%.*]]40; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[TMP1]], <4 x i64> zeroinitializer41; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP2]], <4 x i1> splat (i1 true), <4 x i32> undef)42; CHECK-NEXT:    ret <4 x i32> [[RES]]43;44  %broadcast.splatinsert = insertelement <4 x ptr> undef, ptr %base, i32 045  %broadcast.splat = shufflevector <4 x ptr> %broadcast.splatinsert, <4 x ptr> undef, <4 x i32> zeroinitializer46  %gep = getelementptr i32, <4 x ptr> %broadcast.splat, i64 %index47  %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %gep, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)48  ret <4 x i32> %res49}50 51define <4 x i32> @splat_index(ptr %base, i64 %index) {52; CHECK-LABEL: @splat_index(53; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[BASE:%.*]], i64 [[INDEX:%.*]]54; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr i32, ptr [[TMP1]], <4 x i64> zeroinitializer55; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP2]], <4 x i1> splat (i1 true), <4 x i32> undef)56; CHECK-NEXT:    ret <4 x i32> [[RES]]57;58  %broadcast.splatinsert = insertelement <4 x i64> undef, i64 %index, i32 059  %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> undef, <4 x i32> zeroinitializer60  %gep = getelementptr i32, ptr %base, <4 x i64> %broadcast.splat61  %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %gep, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)62  ret <4 x i32> %res63}64 65define <4 x i32> @test_global_array(<4 x i64> %indxs) {66; CHECK-LABEL: @test_global_array(67; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr @glob_array, <4 x i64> [[INDXS:%.*]]68; CHECK-NEXT:    [[G:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP1]], <4 x i1> splat (i1 true), <4 x i32> undef)69; CHECK-NEXT:    ret <4 x i32> [[G]]70;71  %p = getelementptr inbounds [16 x i32], ptr @glob_array, i64 0, <4 x i64> %indxs72  %g = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %p, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)73  ret <4 x i32> %g74}75 76define <4 x i32> @global_struct_splat() {77; CHECK-LABEL: @global_struct_splat(78; CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 <ptr getelementptr ([[STRUCT_A:%.*]], ptr @c, i64 0, i32 1), ptr getelementptr ([[STRUCT_A]], ptr @c, i64 0, i32 1), ptr getelementptr ([[STRUCT_A]], ptr @c, i64 0, i32 1), ptr getelementptr ([[STRUCT_A]], ptr @c, i64 0, i32 1)>, <4 x i1> splat (i1 true), <4 x i32> undef)79; CHECK-NEXT:    ret <4 x i32> [[TMP1]]80;81  %1 = insertelement <4 x ptr> undef, ptr @c, i32 082  %2 = shufflevector <4 x ptr> %1, <4 x ptr> undef, <4 x i32> zeroinitializer83  %3 = getelementptr %struct.a, <4 x ptr> %2, <4 x i64> zeroinitializer, i32 184  %4 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %3, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> undef)85  ret <4 x i32> %486}87 88define <4 x i32> @splat_ptr_gather(ptr %ptr, <4 x i1> %mask, <4 x i32> %passthru) {89; CHECK-LABEL: @splat_ptr_gather(90; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR:%.*]], <4 x i64> zeroinitializer91; CHECK-NEXT:    [[TMP2:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[TMP1]], <4 x i1> [[MASK:%.*]], <4 x i32> [[PASSTHRU:%.*]])92; CHECK-NEXT:    ret <4 x i32> [[TMP2]]93;94  %1 = insertelement <4 x ptr> undef, ptr %ptr, i32 095  %2 = shufflevector <4 x ptr> %1, <4 x ptr> undef, <4 x i32> zeroinitializer96  %3 = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %2, i32 4, <4 x i1> %mask, <4 x i32> %passthru)97  ret <4 x i32> %398}99 100define void @splat_ptr_scatter(ptr %ptr, <4 x i1> %mask, <4 x i32> %val) {101; CHECK-LABEL: @splat_ptr_scatter(102; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i32, ptr [[PTR:%.*]], <4 x i64> zeroinitializer103; CHECK-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL:%.*]], <4 x ptr> align 4 [[TMP1]], <4 x i1> [[MASK:%.*]])104; CHECK-NEXT:    ret void105;106  %1 = insertelement <4 x ptr> undef, ptr %ptr, i32 0107  %2 = shufflevector <4 x ptr> %1, <4 x ptr> undef, <4 x i32> zeroinitializer108  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> %val, <4 x ptr> %2, i32 4, <4 x i1> %mask)109  ret void110}111 112declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>)113declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, i32, <4 x i1>)114