|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 2 | +;=========================== begin_copyright_notice ============================ |
| 3 | +; |
| 4 | +; Copyright (C) 2025 Intel Corporation |
| 5 | +; |
| 6 | +; SPDX-License-Identifier: MIT |
| 7 | +; |
| 8 | +;============================ end_copyright_notice ============================= |
| 9 | + |
| 10 | +; REQUIRES: regkeys |
| 11 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=1 --regkey=LS_minSplitSize_GRF=0 --regkey=LS_minSplitSize_E=0 %s | FileCheck %s --check-prefix=SPLIT |
| 12 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=1 --regkey=LS_minSplitSize_GRF=100 --regkey=LS_minSplitSize_E=0 %s | FileCheck %s --check-prefix=GRF |
| 13 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=1 --regkey=LS_minSplitSize_GRF=0 --regkey=LS_minSplitSize_E=4 %s | FileCheck %s --check-prefix=ELTS4 |
| 14 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=1 --regkey=LS_minSplitSize_GRF=0 --regkey=LS_minSplitSize_E=8 %s | FileCheck %s --check-prefix=ELTS8 |
| 15 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=1 --regkey=LS_minSplitSize_GRF=0 --regkey=LS_minSplitSize_E=16 %s | FileCheck %s --check-prefix=ELTS16 |
| 16 | +; RUN: igc_opt -S --igc-split-loads -platformpvc --regkey=LS_enableLoadSplitting=1 --regkey=LS_ignoreSplitThreshold=0 --regkey=LS_splitThresholdDelta_GRF=-1000 %s | FileCheck %s --check-prefix=THRESHOLD |
| 17 | + |
| 18 | +declare spir_func void @fun_v4i32(<4 x i32>) |
| 19 | + |
| 20 | +declare spir_func <16 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v16i32(i64, i32, i32, i32, i32, i32, i32, i32, i32, i32, i1, i1, i32) |
| 21 | + |
| 22 | +define spir_kernel void @test_threshold(i64 %ptr) { |
| 23 | +; SPLIT-LABEL: @test_threshold( |
| 24 | +; SPLIT-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 25 | +; SPLIT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 4, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 26 | +; SPLIT-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 8, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 27 | +; SPLIT-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 12, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 28 | +; SPLIT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP1]]) |
| 29 | +; SPLIT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP2]]) |
| 30 | +; SPLIT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP3]]) |
| 31 | +; SPLIT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP4]]) |
| 32 | +; SPLIT-NEXT: ret void |
| 33 | +; |
| 34 | +; GRF-LABEL: @test_threshold( |
| 35 | +; GRF-NEXT: [[VEC1:%.*]] = call <16 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v16i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 16, i32 1, i1 false, i1 false, i32 0) |
| 36 | +; GRF-NEXT: [[PICK1_1:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> |
| 37 | +; GRF-NEXT: [[PICK1_2:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> |
| 38 | +; GRF-NEXT: [[PICK1_3:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 8, i32 9, i32 10, i32 11> |
| 39 | +; GRF-NEXT: [[PICK1_4:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 12, i32 13, i32 14, i32 15> |
| 40 | +; GRF-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_1]]) |
| 41 | +; GRF-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_2]]) |
| 42 | +; GRF-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_3]]) |
| 43 | +; GRF-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_4]]) |
| 44 | +; GRF-NEXT: ret void |
| 45 | +; |
| 46 | +; ELTS4-LABEL: @test_threshold( |
| 47 | +; ELTS4-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 48 | +; ELTS4-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 4, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 49 | +; ELTS4-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 8, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 50 | +; ELTS4-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 12, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 51 | +; ELTS4-NEXT: call void @fun_v4i32(<4 x i32> [[TMP1]]) |
| 52 | +; ELTS4-NEXT: call void @fun_v4i32(<4 x i32> [[TMP2]]) |
| 53 | +; ELTS4-NEXT: call void @fun_v4i32(<4 x i32> [[TMP3]]) |
| 54 | +; ELTS4-NEXT: call void @fun_v4i32(<4 x i32> [[TMP4]]) |
| 55 | +; ELTS4-NEXT: ret void |
| 56 | +; |
| 57 | +; ELTS8-LABEL: @test_threshold( |
| 58 | +; ELTS8-NEXT: [[TMP1:%.*]] = call <8 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v8i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 8, i32 1, i1 false, i1 false, i32 0) |
| 59 | +; ELTS8-NEXT: [[TMP2:%.*]] = extractelement <8 x i32> [[TMP1]], i64 0 |
| 60 | +; ELTS8-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> undef, i32 [[TMP2]], i64 0 |
| 61 | +; ELTS8-NEXT: [[TMP4:%.*]] = extractelement <8 x i32> [[TMP1]], i64 1 |
| 62 | +; ELTS8-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[TMP4]], i64 1 |
| 63 | +; ELTS8-NEXT: [[TMP6:%.*]] = extractelement <8 x i32> [[TMP1]], i64 2 |
| 64 | +; ELTS8-NEXT: [[TMP7:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP6]], i64 2 |
| 65 | +; ELTS8-NEXT: [[TMP8:%.*]] = extractelement <8 x i32> [[TMP1]], i64 3 |
| 66 | +; ELTS8-NEXT: [[TMP9:%.*]] = insertelement <4 x i32> [[TMP7]], i32 [[TMP8]], i64 3 |
| 67 | +; ELTS8-NEXT: [[TMP10:%.*]] = extractelement <8 x i32> [[TMP1]], i64 4 |
| 68 | +; ELTS8-NEXT: [[TMP11:%.*]] = insertelement <4 x i32> undef, i32 [[TMP10]], i64 0 |
| 69 | +; ELTS8-NEXT: [[TMP12:%.*]] = extractelement <8 x i32> [[TMP1]], i64 5 |
| 70 | +; ELTS8-NEXT: [[TMP13:%.*]] = insertelement <4 x i32> [[TMP11]], i32 [[TMP12]], i64 1 |
| 71 | +; ELTS8-NEXT: [[TMP14:%.*]] = extractelement <8 x i32> [[TMP1]], i64 6 |
| 72 | +; ELTS8-NEXT: [[TMP15:%.*]] = insertelement <4 x i32> [[TMP13]], i32 [[TMP14]], i64 2 |
| 73 | +; ELTS8-NEXT: [[TMP16:%.*]] = extractelement <8 x i32> [[TMP1]], i64 7 |
| 74 | +; ELTS8-NEXT: [[TMP17:%.*]] = insertelement <4 x i32> [[TMP15]], i32 [[TMP16]], i64 3 |
| 75 | +; ELTS8-NEXT: [[TMP18:%.*]] = call <8 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v8i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 8, i32 32, i32 16, i32 8, i32 1, i1 false, i1 false, i32 0) |
| 76 | +; ELTS8-NEXT: [[TMP19:%.*]] = extractelement <8 x i32> [[TMP18]], i64 0 |
| 77 | +; ELTS8-NEXT: [[TMP20:%.*]] = insertelement <4 x i32> undef, i32 [[TMP19]], i64 0 |
| 78 | +; ELTS8-NEXT: [[TMP21:%.*]] = extractelement <8 x i32> [[TMP18]], i64 1 |
| 79 | +; ELTS8-NEXT: [[TMP22:%.*]] = insertelement <4 x i32> [[TMP20]], i32 [[TMP21]], i64 1 |
| 80 | +; ELTS8-NEXT: [[TMP23:%.*]] = extractelement <8 x i32> [[TMP18]], i64 2 |
| 81 | +; ELTS8-NEXT: [[TMP24:%.*]] = insertelement <4 x i32> [[TMP22]], i32 [[TMP23]], i64 2 |
| 82 | +; ELTS8-NEXT: [[TMP25:%.*]] = extractelement <8 x i32> [[TMP18]], i64 3 |
| 83 | +; ELTS8-NEXT: [[TMP26:%.*]] = insertelement <4 x i32> [[TMP24]], i32 [[TMP25]], i64 3 |
| 84 | +; ELTS8-NEXT: [[TMP27:%.*]] = extractelement <8 x i32> [[TMP18]], i64 4 |
| 85 | +; ELTS8-NEXT: [[TMP28:%.*]] = insertelement <4 x i32> undef, i32 [[TMP27]], i64 0 |
| 86 | +; ELTS8-NEXT: [[TMP29:%.*]] = extractelement <8 x i32> [[TMP18]], i64 5 |
| 87 | +; ELTS8-NEXT: [[TMP30:%.*]] = insertelement <4 x i32> [[TMP28]], i32 [[TMP29]], i64 1 |
| 88 | +; ELTS8-NEXT: [[TMP31:%.*]] = extractelement <8 x i32> [[TMP18]], i64 6 |
| 89 | +; ELTS8-NEXT: [[TMP32:%.*]] = insertelement <4 x i32> [[TMP30]], i32 [[TMP31]], i64 2 |
| 90 | +; ELTS8-NEXT: [[TMP33:%.*]] = extractelement <8 x i32> [[TMP18]], i64 7 |
| 91 | +; ELTS8-NEXT: [[TMP34:%.*]] = insertelement <4 x i32> [[TMP32]], i32 [[TMP33]], i64 3 |
| 92 | +; ELTS8-NEXT: call void @fun_v4i32(<4 x i32> [[TMP9]]) |
| 93 | +; ELTS8-NEXT: call void @fun_v4i32(<4 x i32> [[TMP17]]) |
| 94 | +; ELTS8-NEXT: call void @fun_v4i32(<4 x i32> [[TMP26]]) |
| 95 | +; ELTS8-NEXT: call void @fun_v4i32(<4 x i32> [[TMP34]]) |
| 96 | +; ELTS8-NEXT: ret void |
| 97 | +; |
| 98 | +; ELTS16-LABEL: @test_threshold( |
| 99 | +; ELTS16-NEXT: [[VEC1:%.*]] = call <16 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v16i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 16, i32 1, i1 false, i1 false, i32 0) |
| 100 | +; ELTS16-NEXT: [[PICK1_1:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> |
| 101 | +; ELTS16-NEXT: [[PICK1_2:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> |
| 102 | +; ELTS16-NEXT: [[PICK1_3:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 8, i32 9, i32 10, i32 11> |
| 103 | +; ELTS16-NEXT: [[PICK1_4:%.*]] = shufflevector <16 x i32> [[VEC1]], <16 x i32> undef, <4 x i32> <i32 12, i32 13, i32 14, i32 15> |
| 104 | +; ELTS16-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_1]]) |
| 105 | +; ELTS16-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_2]]) |
| 106 | +; ELTS16-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_3]]) |
| 107 | +; ELTS16-NEXT: call void @fun_v4i32(<4 x i32> [[PICK1_4]]) |
| 108 | +; ELTS16-NEXT: ret void |
| 109 | +; |
| 110 | +; THRESHOLD-LABEL: @test_threshold( |
| 111 | +; THRESHOLD-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 112 | +; THRESHOLD-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 4, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 113 | +; THRESHOLD-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 8, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 114 | +; THRESHOLD-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 12, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 115 | +; THRESHOLD-NEXT: call void @fun_v4i32(<4 x i32> [[TMP1]]) |
| 116 | +; THRESHOLD-NEXT: call void @fun_v4i32(<4 x i32> [[TMP2]]) |
| 117 | +; THRESHOLD-NEXT: call void @fun_v4i32(<4 x i32> [[TMP3]]) |
| 118 | +; THRESHOLD-NEXT: call void @fun_v4i32(<4 x i32> [[TMP4]]) |
| 119 | +; THRESHOLD-NEXT: ret void |
| 120 | +; |
| 121 | +; DEFAULT-LABEL: @test_threshold( |
| 122 | +; DEFAULT-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR:%.*]], i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 123 | +; DEFAULT-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 4, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 124 | +; DEFAULT-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 8, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 125 | +; DEFAULT-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v4i32(i64 [[PTR]], i32 127, i32 63, i32 127, i32 0, i32 12, i32 32, i32 16, i32 4, i32 1, i1 false, i1 false, i32 0) |
| 126 | +; DEFAULT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP1]]) |
| 127 | +; DEFAULT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP2]]) |
| 128 | +; DEFAULT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP3]]) |
| 129 | +; DEFAULT-NEXT: call void @fun_v4i32(<4 x i32> [[TMP4]]) |
| 130 | +; DEFAULT-NEXT: ret void |
| 131 | + %vec1 = call <16 x i32> @llvm.genx.GenISA.LSC2DBlockRead.v16i32(i64 %ptr, i32 127, i32 63, i32 127, i32 0, i32 0, i32 32, i32 16, i32 16, i32 1, i1 false, i1 false, i32 0) |
| 132 | + %pick1.1 = shufflevector <16 x i32> %vec1, <16 x i32> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> |
| 133 | + %pick1.2 = shufflevector <16 x i32> %vec1, <16 x i32> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> |
| 134 | + %pick1.3 = shufflevector <16 x i32> %vec1, <16 x i32> undef, <4 x i32> <i32 8, i32 9, i32 10, i32 11> |
| 135 | + %pick1.4 = shufflevector <16 x i32> %vec1, <16 x i32> undef, <4 x i32> <i32 12, i32 13, i32 14, i32 15> |
| 136 | + call void @fun_v4i32(<4 x i32> %pick1.1) |
| 137 | + call void @fun_v4i32(<4 x i32> %pick1.2) |
| 138 | + call void @fun_v4i32(<4 x i32> %pick1.3) |
| 139 | + call void @fun_v4i32(<4 x i32> %pick1.4) |
| 140 | + ret void |
| 141 | +} |
0 commit comments