Skip to content

Commit bd01795

Browse files
YuriPlyakhinigcbot
authored andcommitted
More lit tests for memory optimizations
Improve code coverage for Predicated Memory optimizations in Memory Optimization passes: MemOpt2, AdvMemOpt, and PrepareLoadsStoresPass.
1 parent 3843d41 commit bd01795

File tree

6 files changed

+200
-5
lines changed

6 files changed

+200
-5
lines changed

IGC/Compiler/CISACodeGen/MemOpt2.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ class MemInstCluster {
3737
MemInstCluster() {}
3838
~MemInstCluster() {}
3939

40-
MemInstCluster(IGC::CodeGenContext *pCTX, const DataLayout *pDL,
41-
AliasAnalysis *pAA, TargetLibraryInfo* pTLI, unsigned MLT) {
42-
init(pCTX, pDL, pAA, pTLI, MLT);
43-
}
4440
void init(IGC::CodeGenContext *pCTX, const DataLayout *pDL,
4541
AliasAnalysis *pAA, TargetLibraryInfo* pTLI, unsigned MLT) {
4642
CTX = pCTX;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2025 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; RUN: igc_opt --typed-pointers -igc-advmemopt -S < %s 2>&1 | FileCheck %s
10+
; ------------------------------------------------
11+
; AdvMemOpt - checks early exit due to memory writes
12+
; ------------------------------------------------
13+
14+
; CHECK-LABEL: @test(
15+
; CHECK: bb:
16+
; CHECK: call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* [[B:%[A-z0-9]*]], i64 4, i1 true, i32 42){{.*}}, !uniform [[TRUE_MD:![0-9]*]]
17+
; CHECK-NEXT: br label %bb1
18+
; CHECK: bb1:
19+
; CHECK-NEXT: store i32 0, i32* [[B]], align 4
20+
; CHECK-NEXT: call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* [[B]], i64 4, i1 true, i32 43){{.*}}, !uniform [[TRUE_MD]]
21+
; CHECK: ret void
22+
23+
define void @test(i32 %a, i32* %b) {
24+
entry:
25+
%0 = icmp slt i32 %a, 13
26+
br i1 %0, label %bb, label %end
27+
28+
bb:
29+
%1 = phi i32 [ 0, %entry ], [ %3, %bb1 ]
30+
%2 = call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* %b, i64 4, i1 true, i32 42), !uniform !4
31+
br label %bb1
32+
33+
bb1:
34+
store i32 0, i32* %b, align 4
35+
%c = call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* %b, i64 4, i1 true, i32 43), !uniform !4
36+
%3 = add i32 %1, %2
37+
%4 = add i32 %c, %3
38+
%5 = icmp slt i32 %3, %a
39+
br i1 %5, label %bb, label %end
40+
41+
end:
42+
%6 = phi i32 [ %a, %entry ], [ %4, %bb1 ]
43+
call void @llvm.genx.GenISA.PredicatedStore.p0i32.i32(i32* %b, i32 %6, i64 4, i1 true)
44+
ret void
45+
}
46+
47+
; Function Attrs: nounwind readonly
48+
declare i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32*, i64, i1, i32) #0
49+
50+
declare void @llvm.genx.GenISA.PredicatedStore.p0i32.i32(i32*, i32, i64, i1)
51+
52+
attributes #0 = { nounwind readonly }
53+
54+
; CHECK: [[TRUE_MD]] = !{i1 true}
55+
56+
!igc.functions = !{!0}
57+
58+
!0 = !{void (i32, i32*)* @test, !1}
59+
!1 = !{!2, !3}
60+
!2 = !{!"function_type", i32 0}
61+
!3 = !{!"implicit_arg_desc"}
62+
!4 = !{i1 true}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2025 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; RUN: igc_opt --typed-pointers -igc-advmemopt -S < %s 2>&1 | FileCheck %s
10+
; ------------------------------------------------
11+
; AdvMemOpt - check that only uniform load will be hoisted
12+
; ------------------------------------------------
13+
14+
; CHECK-LABEL: @test_uniformness(
15+
; CHECK: bb:
16+
; CHECK: call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* [[B:%[A-z0-9]*]], i64 4, i1 true, i32 42){{.*}}
17+
; CHECK-NEXT: call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* [[B]], i64 4, i1 true, i32 43){{.*}}
18+
; CHECK-NEXT: br label %bb1
19+
; CHECK: bb1:
20+
; CHECK: [[ARRAYIDX1:%[A-z0-9]*]] = getelementptr inbounds i32, i32* [[B]], i64
21+
; CHECK-NEXT: call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* [[ARRAYIDX1]], i64 4, i1 true, i32 44){{.*}}
22+
; CHECK: ret void
23+
24+
define spir_kernel void @test_uniformness(i32* %b, i32 %a, float addrspace(1)* %sf, i16 %localIdX, i16 %localIdY, i16 %localIdZ) {
25+
entry:
26+
%conv.i.i = zext i16 %localIdX to i64
27+
%0 = icmp slt i32 %a, 13
28+
br i1 %0, label %bb, label %end
29+
30+
bb: ; preds = %bb1, %entry
31+
%1 = phi i32 [ 0, %entry ], [ %3, %bb1 ]
32+
%2 = call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* %b, i64 4, i1 true, i32 42)
33+
br label %bb1
34+
35+
bb1: ; preds = %bb
36+
%arrayidx1 = getelementptr inbounds i32, i32* %b, i64 %conv.i.i
37+
%cnu = call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* %arrayidx1, i64 4, i1 true, i32 44)
38+
%c = call i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32* %b, i64 4, i1 true, i32 43)
39+
%3 = add i32 %1, %2
40+
%4 = add i32 %c, %3
41+
%5 = icmp slt i32 %3, %a
42+
br i1 %5, label %bb, label %end
43+
44+
end: ; preds = %bb1, %entry
45+
%6 = phi i32 [ %a, %entry ], [ %4, %bb1 ]
46+
call void @llvm.genx.GenISA.PredicatedStore.p0i32.i32(i32* %b, i32 %6, i64 4, i1 true)
47+
ret void
48+
}
49+
50+
; Function Attrs: nounwind readonly
51+
declare i32 @llvm.genx.GenISA.PredicatedLoad.i32.p0i32.i32(i32*, i64, i1, i32) #0
52+
53+
declare void @llvm.genx.GenISA.PredicatedStore.p0i32.i32(i32*, i32, i64, i1)
54+
55+
attributes #0 = { nounwind readonly }
56+
57+
!IGCMetadata = !{!0}
58+
!igc.functions = !{!347}
59+
60+
!0 = !{!"ModuleMD", !78}
61+
!78 = !{!"FuncMD", !79, !80}
62+
!79 = !{!"FuncMDMap[0]", void (i32*, i32, float addrspace(1)*, i16, i16, i16)* @test_uniformness}
63+
!80 = !{!"FuncMDValue[0]", !87, !114, !166}
64+
!87 = !{!"functionType", !"KernelFunction"}
65+
!114 = !{!"resAllocMD", !115, !116, !117, !118, !134}
66+
!115 = !{!"uavsNumType", i32 3}
67+
!116 = !{!"srvsNumType", i32 0}
68+
!117 = !{!"samplersNumType", i32 0}
69+
!118 = !{!"argAllocMDList", !119, !123, !125, !127, !130, !131, !132, !133}
70+
!119 = !{!"argAllocMDListVec[0]", !120, !121, !122}
71+
!120 = !{!"type", i32 1}
72+
!121 = !{!"extensionType", i32 -1}
73+
!122 = !{!"indexType", i32 0}
74+
!123 = !{!"argAllocMDListVec[1]", !120, !121, !124}
75+
!124 = !{!"indexType", i32 1}
76+
!125 = !{!"argAllocMDListVec[2]", !120, !121, !126}
77+
!126 = !{!"indexType", i32 2}
78+
!127 = !{!"argAllocMDListVec[3]", !128, !121, !129}
79+
!128 = !{!"type", i32 0}
80+
!129 = !{!"indexType", i32 -1}
81+
!130 = !{!"argAllocMDListVec[4]", !128, !121, !129}
82+
!131 = !{!"argAllocMDListVec[5]", !128, !121, !129}
83+
!132 = !{!"argAllocMDListVec[6]", !128, !121, !129}
84+
!133 = !{!"argAllocMDListVec[7]", !128, !121, !129}
85+
!134 = !{!"inlineSamplersMD"}
86+
!166 = !{!"m_OpenCLArgTypeQualifiers", !167, !168, !169}
87+
!167 = !{!"m_OpenCLArgTypeQualifiersVec[0]", !""}
88+
!168 = !{!"m_OpenCLArgTypeQualifiersVec[1]", !""}
89+
!169 = !{!"m_OpenCLArgTypeQualifiersVec[2]", !""}
90+
!347 = !{void (i32*, i32, float addrspace(1)*, i16, i16, i16)* @test_uniformness, !348}
91+
!348 = !{!349, !350}
92+
!349 = !{!"function_type", i32 0}
93+
!350 = !{!"implicit_arg_desc", !351, !352, !353, !354, !355}
94+
!351 = !{i32 0}
95+
!352 = !{i32 1}
96+
!353 = !{i32 8}
97+
!354 = !{i32 9}
98+
!355 = !{i32 10}

IGC/Compiler/tests/AdvMemOpt/basic-predicated.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
;=========================== begin_copyright_notice ============================
22
;
3-
; Copyright (C) 2022 Intel Corporation
3+
; Copyright (C) 2025 Intel Corporation
44
;
55
; SPDX-License-Identifier: MIT
66
;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2025 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
9+
; Test verifies EnableScratchMessageD64WA flag
10+
11+
; REQUIRES: regkeys
12+
; RUN: igc_opt --typed-pointers --regkey EnableScratchMessageD64WA=1 -igc-int-type-legalizer -S %s | FileCheck %s
13+
14+
target datalayout = "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-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-n8:16:32"
15+
16+
define void @src(i64* %in, i64* %out) {
17+
%a = load i64, i64* %in, align 8
18+
store i64 %a, i64* %out, align 8
19+
ret void
20+
}
21+
22+
; CHECK-LABEL: define void @src(
23+
; CHECK: load <2 x i32>, <2 x i32>
24+
; CHECK: store <2 x i32>

IGC/Compiler/tests/PrepareLoadsStores/basic-predicated.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,18 @@ define void @test_store_v2i64(<2 x i64> addrspace(1)* %a, <2 x i64> %b) {
7575

7676
declare void @llvm.genx.GenISA.PredicatedStore.p1i64.i64(i64 addrspace(1)*, i64, i64, i1)
7777
declare void @llvm.genx.GenISA.PredicatedStore.p1v2i64.v2i64(<2 x i64> addrspace(1)*, <2 x i64>, i64, i1)
78+
79+
; Verify that no transformations are applied to the aggregate type
80+
define void @test_load_aggregate({i64, i64} addrspace(1)* %a) {
81+
; CHECK-LABEL: @test_load_aggregate
82+
; CHECK: call { i64, i64 } @llvm.genx.GenISA.PredicatedLoad.s.p1s.s({ i64, i64 } addrspace(1)* %a, i64 8, i1 true, { i64, i64 } { i64 3, i64 4 })
83+
; CHECK: call void @llvm.genx.GenISA.PredicatedStore.p1s.s({ i64, i64 } addrspace(1)* %a, { i64, i64 }
84+
; CHECK: ret void
85+
;
86+
%1 = call { i64, i64 } @llvm.genx.GenISA.PredicatedLoad.s.p1s.s({ i64, i64 } addrspace(1)* %a, i64 8, i1 true, { i64, i64 } { i64 3, i64 4 })
87+
call void @llvm.genx.GenISA.PredicatedStore.p1s.s({ i64, i64 } addrspace(1)* %a, { i64, i64 } %1, i64 8, i1 true)
88+
ret void
89+
}
90+
91+
declare { i64, i64 } @llvm.genx.GenISA.PredicatedLoad.s.p1s.s({ i64, i64 } addrspace(1)*, i64, i1, { i64, i64 }) #0
92+
declare void @llvm.genx.GenISA.PredicatedStore.p1s.s({ i64, i64 } addrspace(1)*, { i64, i64 }, i64, i1)

0 commit comments

Comments
 (0)