mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
GlobalISel: Fix off by one in finding explicit byval alignment
For attribute sets, the return index is at 0, and arguments start at 1. getParamAlignment adds the offset of 1, so we need to convert from attribute index back to IR index.
This commit is contained in:
parent
0d5c3bafbb
commit
d9bf8e78b9
@ -163,7 +163,7 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx,
|
||||
// For ByVal, alignment should be passed from FE. BE will guess if
|
||||
// this info is not there but there are cases it cannot get right.
|
||||
Align FrameAlign;
|
||||
if (auto ParamAlign = FuncInfo.getParamAlign(OpIdx - 2))
|
||||
if (auto ParamAlign = FuncInfo.getParamAlign(OpIdx - 1))
|
||||
FrameAlign = *ParamAlign;
|
||||
else
|
||||
FrameAlign = Align(getTLI()->getByValTypeAlignment(ElementTy, DL));
|
||||
|
@ -1,4 +1,7 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
||||
; Note update_mir_test_checks does not support generating checks for
|
||||
; the frame info, so some functions have manually added stack object
|
||||
; checks.
|
||||
; RUN: llc -march=amdgcn -mcpu=fiji -O0 -stop-after=irtranslator -global-isel -verify-machineinstrs -o - %s | FileCheck %s
|
||||
; FIXME: pre-VI should have same ABI without legal i16 operations.
|
||||
|
||||
@ -1805,12 +1808,19 @@ define void @void_func_byval_i32_byval_i64(i32 addrspace(5)* byval(i32) %arg0, i
|
||||
|
||||
define void @void_func_byval_i8_align32_i16_align64(i8 addrspace(5)* byval(i8) %arg0, i16 addrspace(5)* byval(i16) align 64 %arg1) #0 {
|
||||
; CHECK-LABEL: name: void_func_byval_i8_align32_i16_align64
|
||||
; CHECK: frameInfo:
|
||||
; CHECK: maxAlignment: 64
|
||||
; CHECK: fixedStack:
|
||||
; CHECK: - { id: 0, type: default, offset: 64, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: - { id: 1, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: bb.1 (%ir-block.0):
|
||||
; CHECK: liveins: $sgpr30_sgpr31
|
||||
; CHECK: [[FRAME_INDEX:%[0-9]+]]:_(p5) = G_FRAME_INDEX %fixed-stack.1
|
||||
; CHECK: [[LOAD:%[0-9]+]]:_(p5) = G_LOAD [[FRAME_INDEX]](p5) :: (invariant load 4 from %fixed-stack.1, align 16, addrspace 5)
|
||||
; CHECK: [[FRAME_INDEX1:%[0-9]+]]:_(p5) = G_FRAME_INDEX %fixed-stack.0
|
||||
; CHECK: [[LOAD1:%[0-9]+]]:_(p5) = G_LOAD [[FRAME_INDEX1]](p5) :: (invariant load 4 from %fixed-stack.0, addrspace 5)
|
||||
; CHECK: [[LOAD1:%[0-9]+]]:_(p5) = G_LOAD [[FRAME_INDEX1]](p5) :: (invariant load 4 from %fixed-stack.0, align 16, addrspace 5)
|
||||
; CHECK: [[COPY:%[0-9]+]]:sgpr_64 = COPY $sgpr30_sgpr31
|
||||
; CHECK: [[C:%[0-9]+]]:_(p1) = G_CONSTANT i64 0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:_(p1) = COPY [[C]](p1)
|
||||
@ -1828,8 +1838,15 @@ define void @void_func_byval_i8_align32_i16_align64(i8 addrspace(5)* byval(i8) %
|
||||
}
|
||||
|
||||
; Make sure the alignment is taken from the correct parameter.
|
||||
define void @byval_3ai32_align128_byval_i16_align64([3 x i32] addrspace(5)* byval([3 x i32]) align 128 %arg0, i16 addrspace(5)* byval(i16) align 64 %arg1) #0 {
|
||||
; CHECK-LABEL: name: byval_3ai32_align128_byval_i16_align64
|
||||
define void @byval_a3i32_align128_byval_i16_align64([3 x i32] addrspace(5)* byval([3 x i32]) align 128 %arg0, i16 addrspace(5)* byval(i16) align 64 %arg1) #0 {
|
||||
; CHECK-LABEL: name: byval_a3i32_align128_byval_i16_align64
|
||||
; CHECK: frameInfo:
|
||||
; CHECK: maxAlignment: 128
|
||||
; CHECK: fixedStack:
|
||||
; CHECK-NEXT: - { id: 0, type: default, offset: 64, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: - { id: 1, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: bb.1 (%ir-block.0):
|
||||
; CHECK: liveins: $sgpr30_sgpr31
|
||||
; CHECK: [[FRAME_INDEX:%[0-9]+]]:_(p5) = G_FRAME_INDEX %fixed-stack.1
|
||||
@ -1865,8 +1882,15 @@ define void @byval_3ai32_align128_byval_i16_align64([3 x i32] addrspace(5)* byva
|
||||
}
|
||||
|
||||
; byval argument after non-byval stack passed argument
|
||||
define void @void_func_v32i32_i32_byval_i8(<32 x i32> %arg0, i32 %arg1, i8 addrspace(5)* byval(i8) %arg2) #0 {
|
||||
define void @void_func_v32i32_i32_byval_i8(<32 x i32> %arg0, i32 %arg1, i8 addrspace(5)* byval(i8) align 8 %arg2) #0 {
|
||||
; CHECK-LABEL: name: void_func_v32i32_i32_byval_i8
|
||||
; CHECK: frameInfo:
|
||||
; CHECK: maxAlignment: 8
|
||||
; CHECK: fixedStack:
|
||||
; CHECK: - { id: 0, type: default, offset: 8, size: 4, alignment: 8, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: - { id: 1, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: bb.1 (%ir-block.0):
|
||||
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7, $vgpr8, $vgpr9, $vgpr10, $vgpr11, $vgpr12, $vgpr13, $vgpr14, $vgpr15, $vgpr16, $vgpr17, $vgpr18, $vgpr19, $vgpr20, $vgpr21, $vgpr22, $vgpr23, $vgpr24, $vgpr25, $vgpr26, $vgpr27, $vgpr28, $vgpr29, $vgpr30, $vgpr31, $sgpr30_sgpr31
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
||||
@ -1905,7 +1929,7 @@ define void @void_func_v32i32_i32_byval_i8(<32 x i32> %arg0, i32 %arg1, i8 addrs
|
||||
; CHECK: [[FRAME_INDEX:%[0-9]+]]:_(p5) = G_FRAME_INDEX %fixed-stack.1
|
||||
; CHECK: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[FRAME_INDEX]](p5) :: (invariant load 4 from %fixed-stack.1, align 16, addrspace 5)
|
||||
; CHECK: [[FRAME_INDEX1:%[0-9]+]]:_(p5) = G_FRAME_INDEX %fixed-stack.0
|
||||
; CHECK: [[LOAD1:%[0-9]+]]:_(p5) = G_LOAD [[FRAME_INDEX1]](p5) :: (invariant load 4 from %fixed-stack.0, addrspace 5)
|
||||
; CHECK: [[LOAD1:%[0-9]+]]:_(p5) = G_LOAD [[FRAME_INDEX1]](p5) :: (invariant load 4 from %fixed-stack.0, align 8, addrspace 5)
|
||||
; CHECK: [[COPY32:%[0-9]+]]:sgpr_64 = COPY $sgpr30_sgpr31
|
||||
; CHECK: [[C:%[0-9]+]]:_(p1) = G_CONSTANT i64 0
|
||||
; CHECK: [[COPY33:%[0-9]+]]:_(p1) = COPY [[C]](p1)
|
||||
@ -1923,6 +1947,13 @@ define void @void_func_v32i32_i32_byval_i8(<32 x i32> %arg0, i32 %arg1, i8 addrs
|
||||
; byval argument before non-byval stack passed argument
|
||||
define void @void_func_v32i32_byval_i8_i32(<32 x i32> %arg0, i8 addrspace(5)* byval(i8) %arg1, i32 %arg2) #0 {
|
||||
; CHECK-LABEL: name: void_func_v32i32_byval_i8_i32
|
||||
; CHECK: frameInfo:
|
||||
; CHECK: maxAlignment: 4
|
||||
; CHECK: fixedStack:
|
||||
; CHECK-NEXT: - { id: 0, type: default, offset: 4, size: 4, alignment: 4, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: - { id: 1, type: default, offset: 0, size: 4, alignment: 16, stack-id: default,
|
||||
; CHECK-NEXT: isImmutable: true, isAliased: false, callee-saved-register: '', callee-saved-restored: true,
|
||||
; CHECK: bb.1 (%ir-block.0):
|
||||
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7, $vgpr8, $vgpr9, $vgpr10, $vgpr11, $vgpr12, $vgpr13, $vgpr14, $vgpr15, $vgpr16, $vgpr17, $vgpr18, $vgpr19, $vgpr20, $vgpr21, $vgpr22, $vgpr23, $vgpr24, $vgpr25, $vgpr26, $vgpr27, $vgpr28, $vgpr29, $vgpr30, $vgpr31, $sgpr30_sgpr31
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
||||
|
Loading…
Reference in New Issue
Block a user