Skip to content

Commit 0109450

Browse files
committed
DAG: Fold bitcast of scalar_to_vector to anyext
scalar_to_vector is difficult to make appear and test, but I found one case where this makes an observable difference. It fires more often than this in the test suite, but most of them have no net result in the final code. This helps reduce regressions in a future commit.
1 parent 89fce62 commit 0109450

File tree

2 files changed

+17
-20
lines changed

2 files changed

+17
-20
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16012,6 +16012,14 @@ SDValue DAGCombiner::visitBITCAST(SDNode *N) {
1601216012
if (SDValue CombineLD = CombineConsecutiveLoads(N0.getNode(), VT))
1601316013
return CombineLD;
1601416014

16015+
// int_vt (bitcast (vec_vt (scalar_to_vector elt_vt:x)))
16016+
// => int_vt (any_extend elt_vt:x)
16017+
if (N0.getOpcode() == ISD::SCALAR_TO_VECTOR && VT.isScalarInteger()) {
16018+
SDValue SrcScalar = N0.getOperand(0);
16019+
if (SrcScalar.getValueType().isScalarInteger())
16020+
return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), VT, SrcScalar);
16021+
}
16022+
1601516023
// Remove double bitcasts from shuffles - this is often a legacy of
1601616024
// XformToShuffleWithZero being used to combine bitmaskings (of
1601716025
// float vectors bitcast to integer vectors) into shuffles.

llvm/test/CodeGen/AMDGPU/scalar_to_vector.ll

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -347,26 +347,15 @@ define i64 @bitcast_combine_scalar_to_vector_v4i16(i16 %arg) {
347347
; SI-NEXT: v_or_b32_e32 v1, v2, v3
348348
; SI-NEXT: s_setpc_b64 s[30:31]
349349
;
350-
; VI-LABEL: bitcast_combine_scalar_to_vector_v4i16:
351-
; VI: ; %bb.0:
352-
; VI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353-
; VI-NEXT: v_and_b32_e32 v1, 0xffffff00, v0
354-
; VI-NEXT: v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
355-
; VI-NEXT: v_lshlrev_b32_e32 v2, 16, v1
356-
; VI-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
357-
; VI-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
358-
; VI-NEXT: s_setpc_b64 s[30:31]
359-
;
360-
; GFX9-LABEL: bitcast_combine_scalar_to_vector_v4i16:
361-
; GFX9: ; %bb.0:
362-
; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
363-
; GFX9-NEXT: v_and_b32_e32 v1, 0xffffff00, v0
364-
; GFX9-NEXT: v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
365-
; GFX9-NEXT: s_mov_b32 s4, 0xffff
366-
; GFX9-NEXT: v_lshlrev_b32_e32 v2, 16, v1
367-
; GFX9-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
368-
; GFX9-NEXT: v_and_or_b32 v0, v0, s4, v2
369-
; GFX9-NEXT: s_setpc_b64 s[30:31]
350+
; GFX89-LABEL: bitcast_combine_scalar_to_vector_v4i16:
351+
; GFX89: ; %bb.0:
352+
; GFX89-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
353+
; GFX89-NEXT: v_and_b32_e32 v1, 0xffffff00, v0
354+
; GFX89-NEXT: v_or_b32_sdwa v1, v0, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_1 src1_sel:DWORD
355+
; GFX89-NEXT: v_lshlrev_b32_e32 v2, 16, v1
356+
; GFX89-NEXT: v_or_b32_sdwa v1, v1, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
357+
; GFX89-NEXT: v_or_b32_sdwa v0, v0, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:DWORD
358+
; GFX89-NEXT: s_setpc_b64 s[30:31]
370359
%arg.cast = bitcast i16 %arg to <2 x i8>
371360
%tmp1 = shufflevector <2 x i8> %arg.cast, <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
372361
%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> poison, <8 x i32> <i32 0, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>

0 commit comments

Comments
 (0)