Skip to content

Commit d7338b4

Browse files
committed
[DAGCombiner] Optimize more vector element extractions.
Extracting an element from a non-legal type, floating point constants, and non-zero constants are all worth optimizing; we see better codegen on multiple platforms in existing tests.
1 parent 61ff9f8 commit d7338b4

File tree

7 files changed

+651
-1594
lines changed

7 files changed

+651
-1594
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22240,9 +22240,8 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
2224022240
}
2224122241

2224222242
// extract_vector_elt (build_vector x, y), 1 -> y
22243-
if (((IndexC && VecOp.getOpcode() == ISD::BUILD_VECTOR) ||
22244-
VecOp.getOpcode() == ISD::SPLAT_VECTOR) &&
22245-
TLI.isTypeLegal(VecVT)) {
22243+
if ((IndexC && VecOp.getOpcode() == ISD::BUILD_VECTOR) ||
22244+
VecOp.getOpcode() == ISD::SPLAT_VECTOR) {
2224622245
assert((VecOp.getOpcode() != ISD::BUILD_VECTOR ||
2224722246
VecVT.isFixedLengthVector()) &&
2224822247
"BUILD_VECTOR used for scalable vectors");
@@ -22252,7 +22251,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
2225222251
EVT InEltVT = Elt.getValueType();
2225322252

2225422253
if (VecOp.hasOneUse() || TLI.aggressivelyPreferBuildVectorSources(VecVT) ||
22255-
isNullConstant(Elt)) {
22254+
isIntOrFPConstant(Elt)) {
2225622255
// Sometimes build_vector's scalar input types do not match result type.
2225722256
if (ScalarVT == InEltVT)
2225822257
return Elt;

llvm/test/CodeGen/AMDGPU/fcanonicalize.f16.ll

Lines changed: 1 addition & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,6 @@ define <2 x half> @v_test_canonicalize_build_vector_v2f16(half %lo, half %hi) #1
190190
; CI-LABEL: v_test_canonicalize_build_vector_v2f16:
191191
; CI: ; %bb.0:
192192
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
193-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
194-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
195-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
196-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
197193
; CI-NEXT: s_setpc_b64 s[30:31]
198194
;
199195
; GFX11-LABEL: v_test_canonicalize_build_vector_v2f16:
@@ -2301,12 +2297,6 @@ define <3 x half> @v_test_canonicalize_var_v3f16(<3 x half> %val) #1 {
23012297
; CI-LABEL: v_test_canonicalize_var_v3f16:
23022298
; CI: ; %bb.0:
23032299
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2304-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
2305-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
2306-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
2307-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
2308-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
2309-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
23102300
; CI-NEXT: s_setpc_b64 s[30:31]
23112301
;
23122302
; GFX11-LABEL: v_test_canonicalize_var_v3f16:
@@ -2341,14 +2331,6 @@ define <4 x half> @v_test_canonicalize_var_v4f16(<4 x half> %val) #1 {
23412331
; CI-LABEL: v_test_canonicalize_var_v4f16:
23422332
; CI: ; %bb.0:
23432333
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2344-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
2345-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
2346-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
2347-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
2348-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
2349-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
2350-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
2351-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
23522334
; CI-NEXT: s_setpc_b64 s[30:31]
23532335
;
23542336
; GFX11-LABEL: v_test_canonicalize_var_v4f16:
@@ -2611,9 +2593,7 @@ define <2 x half> @v_test_canonicalize_reg_k_v2f16(half %val) #1 {
26112593
; CI-LABEL: v_test_canonicalize_reg_k_v2f16:
26122594
; CI: ; %bb.0:
26132595
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2614-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
26152596
; CI-NEXT: v_mov_b32_e32 v1, 2.0
2616-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
26172597
; CI-NEXT: s_setpc_b64 s[30:31]
26182598
;
26192599
; GFX11-LABEL: v_test_canonicalize_reg_k_v2f16:
@@ -2647,8 +2627,7 @@ define <2 x half> @v_test_canonicalize_k_reg_v2f16(half %val) #1 {
26472627
; CI-LABEL: v_test_canonicalize_k_reg_v2f16:
26482628
; CI: ; %bb.0:
26492629
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2650-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
2651-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v0
2630+
; CI-NEXT: v_mov_b32_e32 v1, v0
26522631
; CI-NEXT: v_mov_b32_e32 v0, 2.0
26532632
; CI-NEXT: s_setpc_b64 s[30:31]
26542633
;
@@ -2878,18 +2857,6 @@ define <6 x half> @v_test_canonicalize_var_v6f16(<6 x half> %val) #1 {
28782857
; CI-LABEL: v_test_canonicalize_var_v6f16:
28792858
; CI: ; %bb.0:
28802859
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2881-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
2882-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
2883-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
2884-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
2885-
; CI-NEXT: v_cvt_f16_f32_e32 v4, v4
2886-
; CI-NEXT: v_cvt_f16_f32_e32 v5, v5
2887-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
2888-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
2889-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
2890-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
2891-
; CI-NEXT: v_cvt_f32_f16_e32 v4, v4
2892-
; CI-NEXT: v_cvt_f32_f16_e32 v5, v5
28932860
; CI-NEXT: s_setpc_b64 s[30:31]
28942861
;
28952862
; GFX11-LABEL: v_test_canonicalize_var_v6f16:
@@ -2933,22 +2900,6 @@ define <8 x half> @v_test_canonicalize_var_v8f16(<8 x half> %val) #1 {
29332900
; CI-LABEL: v_test_canonicalize_var_v8f16:
29342901
; CI: ; %bb.0:
29352902
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
2936-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
2937-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
2938-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
2939-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
2940-
; CI-NEXT: v_cvt_f16_f32_e32 v4, v4
2941-
; CI-NEXT: v_cvt_f16_f32_e32 v5, v5
2942-
; CI-NEXT: v_cvt_f16_f32_e32 v6, v6
2943-
; CI-NEXT: v_cvt_f16_f32_e32 v7, v7
2944-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
2945-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
2946-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
2947-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
2948-
; CI-NEXT: v_cvt_f32_f16_e32 v4, v4
2949-
; CI-NEXT: v_cvt_f32_f16_e32 v5, v5
2950-
; CI-NEXT: v_cvt_f32_f16_e32 v6, v6
2951-
; CI-NEXT: v_cvt_f32_f16_e32 v7, v7
29522903
; CI-NEXT: s_setpc_b64 s[30:31]
29532904
;
29542905
; GFX11-LABEL: v_test_canonicalize_var_v8f16:
@@ -3001,30 +2952,6 @@ define <12 x half> @v_test_canonicalize_var_v12f16(<12 x half> %val) #1 {
30012952
; CI-LABEL: v_test_canonicalize_var_v12f16:
30022953
; CI: ; %bb.0:
30032954
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3004-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
3005-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
3006-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
3007-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
3008-
; CI-NEXT: v_cvt_f16_f32_e32 v4, v4
3009-
; CI-NEXT: v_cvt_f16_f32_e32 v5, v5
3010-
; CI-NEXT: v_cvt_f16_f32_e32 v6, v6
3011-
; CI-NEXT: v_cvt_f16_f32_e32 v7, v7
3012-
; CI-NEXT: v_cvt_f16_f32_e32 v8, v8
3013-
; CI-NEXT: v_cvt_f16_f32_e32 v9, v9
3014-
; CI-NEXT: v_cvt_f16_f32_e32 v10, v10
3015-
; CI-NEXT: v_cvt_f16_f32_e32 v11, v11
3016-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
3017-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
3018-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
3019-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
3020-
; CI-NEXT: v_cvt_f32_f16_e32 v4, v4
3021-
; CI-NEXT: v_cvt_f32_f16_e32 v5, v5
3022-
; CI-NEXT: v_cvt_f32_f16_e32 v6, v6
3023-
; CI-NEXT: v_cvt_f32_f16_e32 v7, v7
3024-
; CI-NEXT: v_cvt_f32_f16_e32 v8, v8
3025-
; CI-NEXT: v_cvt_f32_f16_e32 v9, v9
3026-
; CI-NEXT: v_cvt_f32_f16_e32 v10, v10
3027-
; CI-NEXT: v_cvt_f32_f16_e32 v11, v11
30282955
; CI-NEXT: s_setpc_b64 s[30:31]
30292956
;
30302957
; GFX11-LABEL: v_test_canonicalize_var_v12f16:
@@ -3087,38 +3014,6 @@ define <16 x half> @v_test_canonicalize_var_v16f16(<16 x half> %val) #1 {
30873014
; CI-LABEL: v_test_canonicalize_var_v16f16:
30883015
; CI: ; %bb.0:
30893016
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
3090-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
3091-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
3092-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
3093-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
3094-
; CI-NEXT: v_cvt_f16_f32_e32 v4, v4
3095-
; CI-NEXT: v_cvt_f16_f32_e32 v5, v5
3096-
; CI-NEXT: v_cvt_f16_f32_e32 v6, v6
3097-
; CI-NEXT: v_cvt_f16_f32_e32 v7, v7
3098-
; CI-NEXT: v_cvt_f16_f32_e32 v8, v8
3099-
; CI-NEXT: v_cvt_f16_f32_e32 v9, v9
3100-
; CI-NEXT: v_cvt_f16_f32_e32 v10, v10
3101-
; CI-NEXT: v_cvt_f16_f32_e32 v11, v11
3102-
; CI-NEXT: v_cvt_f16_f32_e32 v12, v12
3103-
; CI-NEXT: v_cvt_f16_f32_e32 v13, v13
3104-
; CI-NEXT: v_cvt_f16_f32_e32 v14, v14
3105-
; CI-NEXT: v_cvt_f16_f32_e32 v15, v15
3106-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
3107-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
3108-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
3109-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
3110-
; CI-NEXT: v_cvt_f32_f16_e32 v4, v4
3111-
; CI-NEXT: v_cvt_f32_f16_e32 v5, v5
3112-
; CI-NEXT: v_cvt_f32_f16_e32 v6, v6
3113-
; CI-NEXT: v_cvt_f32_f16_e32 v7, v7
3114-
; CI-NEXT: v_cvt_f32_f16_e32 v8, v8
3115-
; CI-NEXT: v_cvt_f32_f16_e32 v9, v9
3116-
; CI-NEXT: v_cvt_f32_f16_e32 v10, v10
3117-
; CI-NEXT: v_cvt_f32_f16_e32 v11, v11
3118-
; CI-NEXT: v_cvt_f32_f16_e32 v12, v12
3119-
; CI-NEXT: v_cvt_f32_f16_e32 v13, v13
3120-
; CI-NEXT: v_cvt_f32_f16_e32 v14, v14
3121-
; CI-NEXT: v_cvt_f32_f16_e32 v15, v15
31223017
; CI-NEXT: s_setpc_b64 s[30:31]
31233018
;
31243019
; GFX11-LABEL: v_test_canonicalize_var_v16f16:
@@ -3216,71 +3111,7 @@ define <32 x half> @v_test_canonicalize_var_v32f16(<32 x half> %val) #1 {
32163111
; CI: ; %bb.0:
32173112
; CI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
32183113
; CI-NEXT: buffer_load_dword v31, off, s[0:3], s32
3219-
; CI-NEXT: v_cvt_f16_f32_e32 v0, v0
3220-
; CI-NEXT: v_cvt_f16_f32_e32 v1, v1
3221-
; CI-NEXT: v_cvt_f16_f32_e32 v2, v2
3222-
; CI-NEXT: v_cvt_f16_f32_e32 v3, v3
3223-
; CI-NEXT: v_cvt_f16_f32_e32 v4, v4
3224-
; CI-NEXT: v_cvt_f16_f32_e32 v5, v5
3225-
; CI-NEXT: v_cvt_f16_f32_e32 v6, v6
3226-
; CI-NEXT: v_cvt_f16_f32_e32 v7, v7
3227-
; CI-NEXT: v_cvt_f16_f32_e32 v8, v8
3228-
; CI-NEXT: v_cvt_f16_f32_e32 v9, v9
3229-
; CI-NEXT: v_cvt_f16_f32_e32 v10, v10
3230-
; CI-NEXT: v_cvt_f16_f32_e32 v11, v11
3231-
; CI-NEXT: v_cvt_f16_f32_e32 v12, v12
3232-
; CI-NEXT: v_cvt_f16_f32_e32 v13, v13
3233-
; CI-NEXT: v_cvt_f16_f32_e32 v14, v14
3234-
; CI-NEXT: v_cvt_f16_f32_e32 v15, v15
3235-
; CI-NEXT: v_cvt_f16_f32_e32 v16, v16
3236-
; CI-NEXT: v_cvt_f16_f32_e32 v17, v17
3237-
; CI-NEXT: v_cvt_f16_f32_e32 v18, v18
3238-
; CI-NEXT: v_cvt_f16_f32_e32 v19, v19
3239-
; CI-NEXT: v_cvt_f16_f32_e32 v20, v20
3240-
; CI-NEXT: v_cvt_f16_f32_e32 v21, v21
3241-
; CI-NEXT: v_cvt_f16_f32_e32 v22, v22
3242-
; CI-NEXT: v_cvt_f16_f32_e32 v23, v23
3243-
; CI-NEXT: v_cvt_f16_f32_e32 v24, v24
3244-
; CI-NEXT: v_cvt_f16_f32_e32 v25, v25
3245-
; CI-NEXT: v_cvt_f16_f32_e32 v26, v26
3246-
; CI-NEXT: v_cvt_f16_f32_e32 v27, v27
3247-
; CI-NEXT: v_cvt_f16_f32_e32 v28, v28
3248-
; CI-NEXT: v_cvt_f16_f32_e32 v29, v29
3249-
; CI-NEXT: v_cvt_f16_f32_e32 v30, v30
3250-
; CI-NEXT: v_cvt_f32_f16_e32 v0, v0
3251-
; CI-NEXT: v_cvt_f32_f16_e32 v1, v1
3252-
; CI-NEXT: v_cvt_f32_f16_e32 v2, v2
3253-
; CI-NEXT: v_cvt_f32_f16_e32 v3, v3
3254-
; CI-NEXT: v_cvt_f32_f16_e32 v4, v4
3255-
; CI-NEXT: v_cvt_f32_f16_e32 v5, v5
3256-
; CI-NEXT: v_cvt_f32_f16_e32 v6, v6
3257-
; CI-NEXT: v_cvt_f32_f16_e32 v7, v7
3258-
; CI-NEXT: v_cvt_f32_f16_e32 v8, v8
3259-
; CI-NEXT: v_cvt_f32_f16_e32 v9, v9
3260-
; CI-NEXT: v_cvt_f32_f16_e32 v10, v10
3261-
; CI-NEXT: v_cvt_f32_f16_e32 v11, v11
3262-
; CI-NEXT: v_cvt_f32_f16_e32 v12, v12
3263-
; CI-NEXT: v_cvt_f32_f16_e32 v13, v13
3264-
; CI-NEXT: v_cvt_f32_f16_e32 v14, v14
3265-
; CI-NEXT: v_cvt_f32_f16_e32 v15, v15
3266-
; CI-NEXT: v_cvt_f32_f16_e32 v16, v16
3267-
; CI-NEXT: v_cvt_f32_f16_e32 v17, v17
3268-
; CI-NEXT: v_cvt_f32_f16_e32 v18, v18
3269-
; CI-NEXT: v_cvt_f32_f16_e32 v19, v19
3270-
; CI-NEXT: v_cvt_f32_f16_e32 v20, v20
3271-
; CI-NEXT: v_cvt_f32_f16_e32 v21, v21
3272-
; CI-NEXT: v_cvt_f32_f16_e32 v22, v22
3273-
; CI-NEXT: v_cvt_f32_f16_e32 v23, v23
3274-
; CI-NEXT: v_cvt_f32_f16_e32 v24, v24
3275-
; CI-NEXT: v_cvt_f32_f16_e32 v25, v25
3276-
; CI-NEXT: v_cvt_f32_f16_e32 v26, v26
3277-
; CI-NEXT: v_cvt_f32_f16_e32 v27, v27
3278-
; CI-NEXT: v_cvt_f32_f16_e32 v28, v28
3279-
; CI-NEXT: v_cvt_f32_f16_e32 v29, v29
3280-
; CI-NEXT: v_cvt_f32_f16_e32 v30, v30
32813114
; CI-NEXT: s_waitcnt vmcnt(0)
3282-
; CI-NEXT: v_cvt_f16_f32_e32 v31, v31
3283-
; CI-NEXT: v_cvt_f32_f16_e32 v31, v31
32843115
; CI-NEXT: s_setpc_b64 s[30:31]
32853116
;
32863117
; GFX11-LABEL: v_test_canonicalize_var_v32f16:

0 commit comments

Comments
 (0)