Skip to content

Commit 9b887f5

Browse files
authored
AMDGPU: Make cvt_pknorm and cvt_pk intrinsics propagate poison (#131059)
1 parent 61adca7 commit 9b887f5

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,10 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
719719
Value *Src0 = II.getArgOperand(0);
720720
Value *Src1 = II.getArgOperand(1);
721721

722+
// TODO: Replace call with scalar operation if only one element is poison.
723+
if (isa<PoisonValue>(Src0) && isa<PoisonValue>(Src1))
724+
return IC.replaceInstUsesWith(II, PoisonValue::get(II.getType()));
725+
722726
if (isa<UndefValue>(Src0) && isa<UndefValue>(Src1)) {
723727
return IC.replaceInstUsesWith(II, UndefValue::get(II.getType()));
724728
}

llvm/test/Transforms/InstCombine/AMDGPU/amdgcn-intrinsics.ll

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,32 @@ define <2 x i16> @undef_cvt_pknorm_i16() {
13201320
ret <2 x i16> %cvt
13211321
}
13221322

1323+
define <2 x i16> @poison_lhs_cvt_pknorm_i16(float %y) {
1324+
; CHECK-LABEL: @poison_lhs_cvt_pknorm_i16(
1325+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float poison, float [[Y:%.*]])
1326+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1327+
;
1328+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float poison, float %y)
1329+
ret <2 x i16> %cvt
1330+
}
1331+
1332+
define <2 x i16> @poison_rhs_cvt_pknorm_i16(float %x) {
1333+
; CHECK-LABEL: @poison_rhs_cvt_pknorm_i16(
1334+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float [[X:%.*]], float poison)
1335+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1336+
;
1337+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float %x, float poison)
1338+
ret <2 x i16> %cvt
1339+
}
1340+
1341+
define <2 x i16> @poison_cvt_pknorm_i16() {
1342+
; CHECK-LABEL: @poison_cvt_pknorm_i16(
1343+
; CHECK-NEXT: ret <2 x i16> poison
1344+
;
1345+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.i16(float poison, float poison)
1346+
ret <2 x i16> %cvt
1347+
}
1348+
13231349
; --------------------------------------------------------------------
13241350
; llvm.amdgcn.cvt.pknorm.u16
13251351
; --------------------------------------------------------------------
@@ -1352,6 +1378,32 @@ define <2 x i16> @undef_cvt_pknorm_u16() {
13521378
ret <2 x i16> %cvt
13531379
}
13541380

1381+
define <2 x i16> @poison_lhs_cvt_pknorm_u16(float %y) {
1382+
; CHECK-LABEL: @poison_lhs_cvt_pknorm_u16(
1383+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float poison, float [[Y:%.*]])
1384+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1385+
;
1386+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float poison, float %y)
1387+
ret <2 x i16> %cvt
1388+
}
1389+
1390+
define <2 x i16> @poison_rhs_cvt_pknorm_u16(float %x) {
1391+
; CHECK-LABEL: @poison_rhs_cvt_pknorm_u16(
1392+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float [[X:%.*]], float poison)
1393+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1394+
;
1395+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float %x, float poison)
1396+
ret <2 x i16> %cvt
1397+
}
1398+
1399+
define <2 x i16> @poison_cvt_pknorm_u16() {
1400+
; CHECK-LABEL: @poison_cvt_pknorm_u16(
1401+
; CHECK-NEXT: ret <2 x i16> poison
1402+
;
1403+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pknorm.u16(float poison, float poison)
1404+
ret <2 x i16> %cvt
1405+
}
1406+
13551407
; --------------------------------------------------------------------
13561408
; llvm.amdgcn.cvt.pk.i16
13571409
; --------------------------------------------------------------------
@@ -1384,6 +1436,32 @@ define <2 x i16> @undef_cvt_pk_i16() {
13841436
ret <2 x i16> %cvt
13851437
}
13861438

1439+
define <2 x i16> @poison_lhs_cvt_pk_i16(i32 %y) {
1440+
; CHECK-LABEL: @poison_lhs_cvt_pk_i16(
1441+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 poison, i32 [[Y:%.*]])
1442+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1443+
;
1444+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 poison, i32 %y)
1445+
ret <2 x i16> %cvt
1446+
}
1447+
1448+
define <2 x i16> @poison_rhs_cvt_pk_i16(i32 %x) {
1449+
; CHECK-LABEL: @poison_rhs_cvt_pk_i16(
1450+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 [[X:%.*]], i32 poison)
1451+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1452+
;
1453+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 %x, i32 poison)
1454+
ret <2 x i16> %cvt
1455+
}
1456+
1457+
define <2 x i16> @poison_cvt_pk_i16() {
1458+
; CHECK-LABEL: @poison_cvt_pk_i16(
1459+
; CHECK-NEXT: ret <2 x i16> poison
1460+
;
1461+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.i16(i32 poison, i32 poison)
1462+
ret <2 x i16> %cvt
1463+
}
1464+
13871465
; --------------------------------------------------------------------
13881466
; llvm.amdgcn.cvt.pk.u16
13891467
; --------------------------------------------------------------------
@@ -1416,6 +1494,32 @@ define <2 x i16> @undef_cvt_pk_u16() {
14161494
ret <2 x i16> %cvt
14171495
}
14181496

1497+
define <2 x i16> @poison_lhs_cvt_pk_u16(i32 %y) {
1498+
; CHECK-LABEL: @poison_lhs_cvt_pk_u16(
1499+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 poison, i32 [[Y:%.*]])
1500+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1501+
;
1502+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 poison, i32 %y)
1503+
ret <2 x i16> %cvt
1504+
}
1505+
1506+
define <2 x i16> @poison_rhs_cvt_pk_u16(i32 %x) {
1507+
; CHECK-LABEL: @poison_rhs_cvt_pk_u16(
1508+
; CHECK-NEXT: [[CVT:%.*]] = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 [[X:%.*]], i32 poison)
1509+
; CHECK-NEXT: ret <2 x i16> [[CVT]]
1510+
;
1511+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 %x, i32 poison)
1512+
ret <2 x i16> %cvt
1513+
}
1514+
1515+
define <2 x i16> @poison_cvt_pk_u16() {
1516+
; CHECK-LABEL: @poison_cvt_pk_u16(
1517+
; CHECK-NEXT: ret <2 x i16> poison
1518+
;
1519+
%cvt = call <2 x i16> @llvm.amdgcn.cvt.pk.u16(i32 poison, i32 poison)
1520+
ret <2 x i16> %cvt
1521+
}
1522+
14191523
; --------------------------------------------------------------------
14201524
; llvm.amdgcn.ubfe
14211525
; --------------------------------------------------------------------

0 commit comments

Comments
 (0)