Skip to content

Commit 856fb07

Browse files
dguzhaevigcbot
authored andcommitted
Correct alignment for stores in FixResourcePtr
FixResourcePtr generates store_raw instrinsics from ordinary stores, copy alignment from input store if it is set.
1 parent cd3d1b1 commit 856fb07

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

Diff for: IGC/Compiler/FixResourcePtr.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,8 @@ Value* FixResourcePtr::CreateLoadIntrinsic(LoadInst* inst, Instruction* bufPtr,
246246
inst->getType()->isVectorTy() ? llvm::GenISAIntrinsic::GenISA_ldrawvector_indexed : llvm::GenISAIntrinsic::GenISA_ldraw_indexed,
247247
tys);
248248

249-
unsigned alignment = (inst->getType()->getScalarSizeInBits() / 8);
250-
if (inst->getAlignment() > 0)
251-
{
252-
alignment = (unsigned)inst->getAlignment();
253-
}
249+
unsigned alignment = std::max(inst->getType()->getScalarSizeInBits() / 8,
250+
(unsigned)inst->getAlignment());
254251

255252
Value* attr[] =
256253
{
@@ -307,12 +304,15 @@ Value* FixResourcePtr::CreateStoreIntrinsic(StoreInst* inst, Instruction* bufPtr
307304
types);
308305

309306
}
307+
unsigned alignment = std::max(storeVal->getType()->getScalarSizeInBits() / 8,
308+
(unsigned)inst->getAlignment());
309+
310310
Value* attr[] =
311311
{
312312
bufPtr,
313313
offsetVal,
314314
storeVal,
315-
builder->getInt32(storeVal->getType()->getScalarSizeInBits() / 8),
315+
builder->getInt32(alignment),
316316
builder->getInt1(inst->isVolatile())
317317
};
318318
Value* st = builder->CreateCall(l, attr);

Diff for: IGC/Compiler/tests/FixResourcePtr/basic.ll

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2022 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
;
9+
; RUN: igc_opt --igc-fix-resource-ptr -S < %s 2>&1 | FileCheck %s
10+
; ------------------------------------------------
11+
; FixResourcePtr
12+
; ------------------------------------------------
13+
14+
define spir_kernel void @test_direct(i32 %src) {
15+
; CHECK-LABEL: @test_direct(
16+
; CHECK: [[TMP1:%.*]] = call i32 addrspace(131072)* @llvm.genx.GenISA.GetBufferPtr.p131072i32(i32 13, i32 1)
17+
; CHECK: [[TMP2:%.*]] = load <2 x i16>, <2 x i16> addrspace(131085)* null
18+
; CHECK: store <2 x i16> [[TMP2]], <2 x i16> addrspace(131085)* null
19+
; CHECK: store i32 [[SRC:%.*]], i32 addrspace(131085)* inttoptr (i64 16 to i32 addrspace(131085)*)
20+
; CHECK: ret void
21+
;
22+
%1 = call i32 addrspace(131072)* @llvm.genx.GenISA.GetBufferPtr.p131072i32(i32 13, i32 1)
23+
%2 = bitcast i32 addrspace(131072)* %1 to <2 x i16> addrspace(131072)*
24+
%3 = load <2 x i16>, <2 x i16> addrspace(131072)* %2
25+
store <2 x i16> %3, <2 x i16> addrspace(131072)* %2
26+
%4 = getelementptr inbounds i32, i32 addrspace(131072)* %1, i64 4
27+
%5 = load i32, i32 addrspace(131072)* %4
28+
store i32 %src, i32 addrspace(131072)* %4
29+
ret void
30+
}
31+
32+
define spir_kernel void @test_indirect(i32 %src) {
33+
; CHECK-LABEL: @test_indirect(
34+
; CHECK: [[TMP1:%.*]] = call i32 addrspace(2752512)* @llvm.genx.GenISA.GetBufferPtr.p2752512i32(i32 13, i32 1)
35+
; CHECK: [[TMP2:%.*]] = call <2 x i16> @llvm.genx.GenISA.ldrawvector.indexed.v2i16.p2752512i32(i32 addrspace(2752512)* [[TMP1]], i32 0, i32 {{2|4}}, i1 false)
36+
; CHECK: call void @llvm.genx.GenISA.storerawvector.indexed.p2752512i32.v2i16(i32 addrspace(2752512)* [[TMP1]], i32 0, <2 x i16> [[TMP2]], i32 16, i1 false)
37+
; CHECK: [[TMP3:%.*]] = call i32 @llvm.genx.GenISA.ldraw.indexed.i32.p2752512i32(i32 addrspace(2752512)* [[TMP1]], i32 16, i32 16, i1 false)
38+
; CHECK: [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float
39+
; CHECK: call void @llvm.genx.GenISA.storeraw.indexed.p2752512i32.f32(i32 addrspace(2752512)* [[TMP1]], i32 16, float [[TMP4]], i32 {{2|4}}, i1 false)
40+
; CHECK: ret void
41+
;
42+
%1 = call i32 addrspace(2752512)* @llvm.genx.GenISA.GetBufferPtr.p2752512i32(i32 13, i32 1)
43+
%2 = bitcast i32 addrspace(2752512)* %1 to <2 x i16> addrspace(2752512)*
44+
%3 = load <2 x i16>, <2 x i16> addrspace(2752512)* %2
45+
store <2 x i16> %3, <2 x i16> addrspace(2752512)* %2, align 16
46+
%4 = getelementptr inbounds i32, i32 addrspace(2752512)* %1, i32 4
47+
%5 = load i32, i32 addrspace(2752512)* %4, align 16
48+
store i32 %5, i32 addrspace(2752512)* %4
49+
ret void
50+
}
51+
52+
declare i32 addrspace(131072)* @llvm.genx.GenISA.GetBufferPtr.p131072i32(i32, i32)
53+
declare i32 addrspace(2752512)* @llvm.genx.GenISA.GetBufferPtr.p2752512i32(i32, i32)
54+

0 commit comments

Comments
 (0)