forked from OSchip/llvm-project
AMDGPU/GlobalISel: Widen 16-bit G_MERGE_VALUEs sources
Continue making a mess of merge/unmerge legality. llvm-svn: 373942
This commit is contained in:
parent
d03068c3e1
commit
578fa2819f
|
@ -988,7 +988,7 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_,
|
|||
return false;
|
||||
};
|
||||
|
||||
getActionDefinitionsBuilder(Op)
|
||||
auto &Builder = getActionDefinitionsBuilder(Op)
|
||||
.widenScalarToNextPow2(LitTyIdx, /*Min*/ 16)
|
||||
// Clamp the little scalar to s8-s256 and make it a power of 2. It's not
|
||||
// worth considering the multiples of 64 since 2*192 and 2*384 are not
|
||||
|
@ -1007,25 +1007,36 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST_,
|
|||
[=](const LegalityQuery &Query) { return notValidElt(Query, 1); },
|
||||
scalarize(1))
|
||||
.clampScalar(BigTyIdx, S32, S1024)
|
||||
.lowerFor({{S16, V2S16}})
|
||||
.widenScalarIf(
|
||||
.lowerFor({{S16, V2S16}});
|
||||
|
||||
if (Op == G_MERGE_VALUES) {
|
||||
Builder.widenScalarIf(
|
||||
// TODO: Use 16-bit shifts if legal for 8-bit values?
|
||||
[=](const LegalityQuery &Query) {
|
||||
const LLT &Ty = Query.Types[BigTyIdx];
|
||||
return !isPowerOf2_32(Ty.getSizeInBits()) &&
|
||||
Ty.getSizeInBits() % 16 != 0;
|
||||
const LLT Ty = Query.Types[LitTyIdx];
|
||||
return Ty.getSizeInBits() < 32;
|
||||
},
|
||||
[=](const LegalityQuery &Query) {
|
||||
// Pick the next power of 2, or a multiple of 64 over 128.
|
||||
// Whichever is smaller.
|
||||
const LLT &Ty = Query.Types[BigTyIdx];
|
||||
unsigned NewSizeInBits = 1 << Log2_32_Ceil(Ty.getSizeInBits() + 1);
|
||||
if (NewSizeInBits >= 256) {
|
||||
unsigned RoundedTo = alignTo<64>(Ty.getSizeInBits() + 1);
|
||||
if (RoundedTo < NewSizeInBits)
|
||||
NewSizeInBits = RoundedTo;
|
||||
}
|
||||
return std::make_pair(BigTyIdx, LLT::scalar(NewSizeInBits));
|
||||
})
|
||||
changeTo(LitTyIdx, S32));
|
||||
}
|
||||
|
||||
Builder.widenScalarIf(
|
||||
[=](const LegalityQuery &Query) {
|
||||
const LLT Ty = Query.Types[BigTyIdx];
|
||||
return !isPowerOf2_32(Ty.getSizeInBits()) &&
|
||||
Ty.getSizeInBits() % 16 != 0;
|
||||
},
|
||||
[=](const LegalityQuery &Query) {
|
||||
// Pick the next power of 2, or a multiple of 64 over 128.
|
||||
// Whichever is smaller.
|
||||
const LLT &Ty = Query.Types[BigTyIdx];
|
||||
unsigned NewSizeInBits = 1 << Log2_32_Ceil(Ty.getSizeInBits() + 1);
|
||||
if (NewSizeInBits >= 256) {
|
||||
unsigned RoundedTo = alignTo<64>(Ty.getSizeInBits() + 1);
|
||||
if (RoundedTo < NewSizeInBits)
|
||||
NewSizeInBits = RoundedTo;
|
||||
}
|
||||
return std::make_pair(BigTyIdx, LLT::scalar(NewSizeInBits));
|
||||
})
|
||||
.legalIf([=](const LegalityQuery &Query) {
|
||||
const LLT &BigTy = Query.Types[BigTyIdx];
|
||||
const LLT &LitTy = Query.Types[LitTyIdx];
|
||||
|
|
|
@ -39,8 +39,12 @@ body: |
|
|||
; CI: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[AND3]], [[C5]](s32)
|
||||
; CI: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[SHL1]](s32)
|
||||
; CI: [[OR1:%[0-9]+]]:_(s16) = G_OR [[AND2]], [[TRUNC3]]
|
||||
; CI: [[MV1:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16)
|
||||
; CI: $vgpr0 = COPY [[MV1]](s32)
|
||||
; CI: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CI: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CI: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CI: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C7]](s32)
|
||||
; CI: [[OR2:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL2]]
|
||||
; CI: $vgpr0 = COPY [[OR2]](s32)
|
||||
%0:_(p6) = COPY $vgpr0
|
||||
%1:_(s32) = G_LOAD %0 :: (load 4, align 1, addrspace 6)
|
||||
$vgpr0 = COPY %1
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -55,7 +55,16 @@ body: |
|
|||
; CHECK: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[AND7]], [[C1]](s32)
|
||||
; CHECK: [[TRUNC7:%[0-9]+]]:_(s16) = G_TRUNC [[SHL3]](s32)
|
||||
; CHECK: [[OR3:%[0-9]+]]:_(s16) = G_OR [[AND6]], [[TRUNC7]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16), [[OR2]](s16), [[OR3]](s16)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL4:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C3]](s32)
|
||||
; CHECK: [[OR4:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL4]]
|
||||
; CHECK: [[ZEXT2:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
|
||||
; CHECK: [[ZEXT3:%[0-9]+]]:_(s32) = G_ZEXT [[OR3]](s16)
|
||||
; CHECK: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[ZEXT3]], [[C3]](s32)
|
||||
; CHECK: [[OR5:%[0-9]+]]:_(s32) = G_OR [[ZEXT2]], [[SHL5]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(p1) = G_MERGE_VALUES [[OR4]](s32), [[OR5]](s32)
|
||||
; CHECK: $vgpr0_vgpr1 = COPY [[MV]](p1)
|
||||
%0:_(s32) = COPY $vgpr0
|
||||
%1:_(s32) = COPY $vgpr1
|
||||
|
@ -131,8 +140,12 @@ body: |
|
|||
; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[AND3]], [[C4]](s32)
|
||||
; CHECK: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[SHL1]](s32)
|
||||
; CHECK: [[OR1:%[0-9]+]]:_(s16) = G_OR [[AND2]], [[TRUNC3]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16)
|
||||
; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[MV]](s32)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CHECK: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C6]](s32)
|
||||
; CHECK: [[OR2:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL2]]
|
||||
; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[OR2]](s32)
|
||||
; CHECK: $vgpr0 = COPY [[COPY3]](s32)
|
||||
%0:_(s8) = G_CONSTANT i8 0
|
||||
%1:_(s8) = G_CONSTANT i8 1
|
||||
|
@ -169,8 +182,12 @@ body: |
|
|||
; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[AND3]], [[C5]](s32)
|
||||
; CHECK: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[SHL1]](s32)
|
||||
; CHECK: [[OR1:%[0-9]+]]:_(s16) = G_OR [[AND2]], [[TRUNC3]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16)
|
||||
; CHECK: $vgpr0 = COPY [[MV]](s32)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CHECK: [[C7:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C7]](s32)
|
||||
; CHECK: [[OR2:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL2]]
|
||||
; CHECK: $vgpr0 = COPY [[OR2]](s32)
|
||||
%0:_(s8) = G_CONSTANT i8 0
|
||||
%1:_(s8) = G_CONSTANT i8 1
|
||||
%2:_(s8) = G_CONSTANT i8 2
|
||||
|
@ -205,11 +222,21 @@ body: |
|
|||
; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
||||
; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
|
||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
|
||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)
|
||||
; CHECK: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[COPY2]](s32)
|
||||
; CHECK: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[COPY3]](s32)
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[TRUNC]](s16), [[TRUNC1]](s16), [[TRUNC2]](s16), [[TRUNC3]](s16)
|
||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
|
||||
; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
|
||||
; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
|
||||
; CHECK: [[COPY5:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
|
||||
; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY5]], [[C]]
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C1]](s32)
|
||||
; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
|
||||
; CHECK: [[COPY6:%[0-9]+]]:_(s32) = COPY [[COPY2]](s32)
|
||||
; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[COPY6]], [[C]]
|
||||
; CHECK: [[COPY7:%[0-9]+]]:_(s32) = COPY [[COPY3]](s32)
|
||||
; CHECK: [[AND3:%[0-9]+]]:_(s32) = G_AND [[COPY7]], [[C]]
|
||||
; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[AND3]], [[C1]](s32)
|
||||
; CHECK: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL1]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR]](s32), [[OR1]](s32)
|
||||
; CHECK: $vgpr1_vgpr2 = COPY [[MV]](s64)
|
||||
%0:_(s32) = COPY $vgpr0
|
||||
%1:_(s32) = COPY $vgpr1
|
||||
|
@ -278,8 +305,12 @@ body: |
|
|||
; CHECK: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[AND7]], [[C9]](s32)
|
||||
; CHECK: [[TRUNC7:%[0-9]+]]:_(s16) = G_TRUNC [[SHL5]](s32)
|
||||
; CHECK: [[OR5:%[0-9]+]]:_(s16) = G_OR [[OR4]], [[TRUNC7]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[OR2]](s16), [[OR5]](s16)
|
||||
; CHECK: [[TRUNC8:%[0-9]+]]:_(s24) = G_TRUNC [[MV]](s32)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR5]](s16)
|
||||
; CHECK: [[C10:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL6:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C10]](s32)
|
||||
; CHECK: [[OR6:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL6]]
|
||||
; CHECK: [[TRUNC8:%[0-9]+]]:_(s24) = G_TRUNC [[OR6]](s32)
|
||||
; CHECK: S_NOP 0, implicit [[TRUNC8]](s24)
|
||||
%0:_(s4) = G_CONSTANT i4 0
|
||||
%1:_(s4) = G_CONSTANT i4 1
|
||||
|
@ -346,8 +377,12 @@ body: |
|
|||
; CHECK: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[AND7]], [[C10]](s32)
|
||||
; CHECK: [[TRUNC7:%[0-9]+]]:_(s16) = G_TRUNC [[SHL5]](s32)
|
||||
; CHECK: [[OR5:%[0-9]+]]:_(s16) = G_OR [[OR4]], [[TRUNC7]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s32) = G_MERGE_VALUES [[OR2]](s16), [[OR5]](s16)
|
||||
; CHECK: [[TRUNC8:%[0-9]+]]:_(s28) = G_TRUNC [[MV]](s32)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR5]](s16)
|
||||
; CHECK: [[C11:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL6:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C11]](s32)
|
||||
; CHECK: [[OR6:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL6]]
|
||||
; CHECK: [[TRUNC8:%[0-9]+]]:_(s28) = G_TRUNC [[OR6]](s32)
|
||||
; CHECK: S_NOP 0, implicit [[TRUNC8]](s28)
|
||||
%0:_(s4) = G_CONSTANT i4 0
|
||||
%1:_(s4) = G_CONSTANT i4 1
|
||||
|
@ -442,7 +477,20 @@ body: |
|
|||
; CHECK: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[AND11]], [[COPY10]](s32)
|
||||
; CHECK: [[TRUNC11:%[0-9]+]]:_(s16) = G_TRUNC [[SHL5]](s32)
|
||||
; CHECK: [[OR5:%[0-9]+]]:_(s16) = G_OR [[AND10]], [[TRUNC11]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16), [[OR2]](s16), [[OR3]](s16), [[OR4]](s16), [[OR5]](s16)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CHECK: [[C14:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL6:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C14]](s32)
|
||||
; CHECK: [[OR6:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL6]]
|
||||
; CHECK: [[ZEXT2:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
|
||||
; CHECK: [[ZEXT3:%[0-9]+]]:_(s32) = G_ZEXT [[OR3]](s16)
|
||||
; CHECK: [[SHL7:%[0-9]+]]:_(s32) = G_SHL [[ZEXT3]], [[C14]](s32)
|
||||
; CHECK: [[OR7:%[0-9]+]]:_(s32) = G_OR [[ZEXT2]], [[SHL7]]
|
||||
; CHECK: [[ZEXT4:%[0-9]+]]:_(s32) = G_ZEXT [[OR4]](s16)
|
||||
; CHECK: [[ZEXT5:%[0-9]+]]:_(s32) = G_ZEXT [[OR5]](s16)
|
||||
; CHECK: [[SHL8:%[0-9]+]]:_(s32) = G_SHL [[ZEXT5]], [[C14]](s32)
|
||||
; CHECK: [[OR8:%[0-9]+]]:_(s32) = G_OR [[ZEXT4]], [[SHL8]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[OR6]](s32), [[OR7]](s32), [[OR8]](s32)
|
||||
; CHECK: $vgpr0_vgpr1_vgpr2 = COPY [[MV]](s96)
|
||||
%0:_(s8) = G_CONSTANT i8 0
|
||||
%1:_(s8) = G_CONSTANT i8 1
|
||||
|
@ -466,13 +514,20 @@ name: test_merge_s96_s16_s16_s16_s16_s16_s16
|
|||
body: |
|
||||
bb.0:
|
||||
; CHECK-LABEL: name: test_merge_s96_s16_s16_s16_s16_s16_s16
|
||||
; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
|
||||
; CHECK: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 2
|
||||
; CHECK: [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 3
|
||||
; CHECK: [[C4:%[0-9]+]]:_(s16) = G_CONSTANT i16 4
|
||||
; CHECK: [[C5:%[0-9]+]]:_(s16) = G_CONSTANT i16 5
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[C]](s16), [[C1]](s16), [[C2]](s16), [[C3]](s16), [[C4]](s16), [[C5]](s16)
|
||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
|
||||
; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[C1]], [[C2]](s32)
|
||||
; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[C]], [[SHL]]
|
||||
; CHECK: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
|
||||
; CHECK: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 3
|
||||
; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[C4]], [[C2]](s32)
|
||||
; CHECK: [[OR1:%[0-9]+]]:_(s32) = G_OR [[C3]], [[SHL1]]
|
||||
; CHECK: [[C5:%[0-9]+]]:_(s32) = G_CONSTANT i32 4
|
||||
; CHECK: [[C6:%[0-9]+]]:_(s32) = G_CONSTANT i32 5
|
||||
; CHECK: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[C6]], [[C2]](s32)
|
||||
; CHECK: [[OR2:%[0-9]+]]:_(s32) = G_OR [[C5]], [[SHL2]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[OR]](s32), [[OR1]](s32), [[OR2]](s32)
|
||||
; CHECK: $vgpr0_vgpr1_vgpr2 = COPY [[MV]](s96)
|
||||
%0:_(s16) = G_CONSTANT i16 0
|
||||
%1:_(s16) = G_CONSTANT i16 1
|
||||
|
@ -531,7 +586,16 @@ body: |
|
|||
; CHECK: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[AND7]], [[C8]](s32)
|
||||
; CHECK: [[TRUNC7:%[0-9]+]]:_(s16) = G_TRUNC [[SHL3]](s32)
|
||||
; CHECK: [[OR3:%[0-9]+]]:_(s16) = G_OR [[AND6]], [[TRUNC7]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR]](s16), [[OR1]](s16), [[OR2]](s16), [[OR3]](s16)
|
||||
; CHECK: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
|
||||
; CHECK: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
|
||||
; CHECK: [[C10:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL4:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C10]](s32)
|
||||
; CHECK: [[OR4:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL4]]
|
||||
; CHECK: [[ZEXT2:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
|
||||
; CHECK: [[ZEXT3:%[0-9]+]]:_(s32) = G_ZEXT [[OR3]](s16)
|
||||
; CHECK: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[ZEXT3]], [[C10]](s32)
|
||||
; CHECK: [[OR5:%[0-9]+]]:_(s32) = G_OR [[ZEXT2]], [[SHL5]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR4]](s32), [[OR5]](s32)
|
||||
; CHECK: [[TRUNC8:%[0-9]+]]:_(s56) = G_TRUNC [[MV]](s64)
|
||||
; CHECK: S_NOP 0, implicit [[TRUNC8]](s56)
|
||||
%0:_(s8) = G_CONSTANT i8 0
|
||||
|
@ -706,12 +770,80 @@ name: test_merge_p3_s16_s16
|
|||
body: |
|
||||
bb.0:
|
||||
; CHECK-LABEL: name: test_merge_p3_s16_s16
|
||||
; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
|
||||
; CHECK: [[MV:%[0-9]+]]:_(p3) = G_MERGE_VALUES [[C]](s16), [[C1]](s16)
|
||||
; CHECK: $vgpr0 = COPY [[MV]](p3)
|
||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
|
||||
; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[C1]], [[C2]](s32)
|
||||
; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[C]], [[SHL]]
|
||||
; CHECK: [[INTTOPTR:%[0-9]+]]:_(p3) = G_INTTOPTR [[OR]](s32)
|
||||
; CHECK: $vgpr0 = COPY [[INTTOPTR]](p3)
|
||||
%0:_(s16) = G_CONSTANT i16 0
|
||||
%1:_(s16) = G_CONSTANT i16 1
|
||||
%2:_(p3) = G_MERGE_VALUES %0, %1
|
||||
$vgpr0 = COPY %2
|
||||
...
|
||||
|
||||
---
|
||||
name: test_merge_s32_s16_s16
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $vgpr0, $vgpr1
|
||||
|
||||
; CHECK-LABEL: name: test_merge_s32_s16_s16
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
|
||||
; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
|
||||
; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY2]], [[C]]
|
||||
; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
|
||||
; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C1]](s32)
|
||||
; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
|
||||
; CHECK: $vgpr0 = COPY [[OR]](s32)
|
||||
%0:_(s32) = COPY $vgpr0
|
||||
%1:_(s32) = COPY $vgpr1
|
||||
%2:_(s16) = G_TRUNC %0
|
||||
%3:_(s16) = G_TRUNC %1
|
||||
%4:_(s32) = G_MERGE_VALUES %2, %3
|
||||
$vgpr0 = COPY %4
|
||||
...
|
||||
|
||||
---
|
||||
name: test_merge_s48_s16_s16_s16
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
||||
|
||||
; CHECK-LABEL: name: test_merge_s48_s16_s16_s16
|
||||
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
||||
; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
||||
; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
|
||||
; CHECK: [[COPY3:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
|
||||
; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY3]], [[C]]
|
||||
; CHECK: [[COPY4:%[0-9]+]]:_(s32) = COPY [[COPY1]](s32)
|
||||
; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[COPY4]], [[C]]
|
||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
|
||||
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C1]](s32)
|
||||
; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
|
||||
; CHECK: [[COPY5:%[0-9]+]]:_(s32) = COPY [[COPY2]](s32)
|
||||
; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[COPY5]], [[C]]
|
||||
; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
||||
; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[C2]], [[C1]](s32)
|
||||
; CHECK: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL1]]
|
||||
; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR]](s32), [[OR1]](s32)
|
||||
; CHECK: [[COPY6:%[0-9]+]]:_(s64) = COPY [[MV]](s64)
|
||||
; CHECK: $vgpr0_vgpr1 = COPY [[COPY6]](s64)
|
||||
%0:_(s32) = COPY $vgpr0
|
||||
%1:_(s32) = COPY $vgpr1
|
||||
%2:_(s32) = COPY $vgpr2
|
||||
|
||||
%3:_(s16) = G_TRUNC %0
|
||||
%4:_(s16) = G_TRUNC %1
|
||||
%5:_(s16) = G_TRUNC %2
|
||||
|
||||
%6:_(s48) = G_MERGE_VALUES %3, %4, %5
|
||||
%7:_(s64) = G_ANYEXT %6
|
||||
$vgpr0_vgpr1 = COPY %7
|
||||
...
|
||||
|
|
Loading…
Reference in New Issue