diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2020-01-10 17:50:45 -0500 |
---|---|---|
committer | Matt Arsenault <arsenm2@gmail.com> | 2020-01-13 08:29:45 -0500 |
commit | d7d88b9d8b3efd8b4b07074aa64b5b4136a35b2c (patch) | |
tree | d9507fa5a8a2df233182e9c537d0a63c8e19d952 | |
parent | a70b993239a829f30ff1e5991670a0b28bf51459 (diff) | |
download | bcm5719-llvm-d7d88b9d8b3efd8b4b07074aa64b5b4136a35b2c.tar.gz bcm5719-llvm-d7d88b9d8b3efd8b4b07074aa64b5b4136a35b2c.zip |
GlobalISel: Fix assertion on wide G_ZEXT sources
It's possible to have a type that needs a mask greater than 64-bits.
-rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h | 3 | ||||
-rw-r--r-- | llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-zext.mir | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h index 4c2ab316930..dd32a3b9e38 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h @@ -113,7 +113,8 @@ public: LLVM_DEBUG(dbgs() << ".. Combine MI: " << MI;); LLT SrcTy = MRI.getType(SrcReg); APInt Mask = APInt::getAllOnesValue(SrcTy.getScalarSizeInBits()); - auto MIBMask = Builder.buildConstant(DstTy, Mask.getZExtValue()); + auto MIBMask = Builder.buildConstant( + DstTy, Mask.zext(DstTy.getScalarSizeInBits())); Builder.buildAnd(DstReg, Builder.buildAnyExtOrTrunc(DstTy, TruncSrc), MIBMask); markInstAndDefDead(MI, *MRI.getVRegDef(SrcReg), DeadInsts); diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-zext.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-zext.mir index e141a19788b..f50b8d3a597 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-zext.mir +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-zext.mir @@ -88,3 +88,28 @@ body: | %2:_(<3 x s32>) = G_ZEXT %1 $vgpr0_vgpr1_vgpr2 = COPY %2 ... + +# Test for "Too many bits for uint64_t" assertion when combining +# zexts with wide sources. +--- +name: test_zext_128_trunc_s128_merge +body: | + bb.0: + liveins: $vgpr0_vgpr1 + + ; CHECK-LABEL: name: test_zext_128_trunc_s128_merge + ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 + ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 + ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1 + ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 4294967295 + ; CHECK: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]] + ; CHECK: [[AND1:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C1]] + ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[AND]](s64), [[AND1]](s64) + ; CHECK: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[MV]](s128) + %0:_(s64) = COPY $vgpr0_vgpr1 + %1:_(s64) = COPY $vgpr0_vgpr1 + %2:_(s128) = G_MERGE_VALUES %0, %1 + %3:_(s96) = G_TRUNC %2 + %4:_(s128) = G_ZEXT %3 + $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %4 +... |