# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=amdgcn -mcpu=gfx1250 -run-pass=postmisched,gcn-create-vopd %s -o - | FileCheck -check-prefix=GFX1250 %s # RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass=postmisched,gcn-create-vopd %s -o - | FileCheck -check-prefix=GFX1200 %s # Test multi-cycle VOPD formation constraints # When OpX is a DPMACC instruction (multi-cycle) and OpX writes to # OpY's source registers, VOPD formation is blocked. OpX must come second in # original program order, or this would otherwise be a regular data dependency. # This applies to: # V_FMA_F64, V_ADD_F64, V_MUL_F64, V_MAX_NUM_F64, V_MIN_NUM_F64 --- name: test_fma_f64_dpmacc_constraint tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-LABEL: name: test_fma_f64_dpmacc_constraint ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr8 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr7, implicit $mode, implicit $exec ; GFX1250-NEXT: $vgpr6_vgpr7 = V_FMA_F64_e64 0, killed $vgpr0_vgpr1, 0, killed $vgpr2_vgpr3, 0, killed $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_fma_f64_dpmacc_constraint ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr8 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr7, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr6_vgpr7 = V_FMA_F64_e64 0, killed $vgpr0_vgpr1, 0, killed $vgpr2_vgpr3, 0, killed $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr8 = V_ADD_F32_e32 $vgpr6, $vgpr7, implicit $mode, implicit $exec $vgpr6_vgpr7 = V_FMA_F64_e64 0, $vgpr0_vgpr1, 0, $vgpr2_vgpr3, 0, $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_add_f64_dpmacc_constraint tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-LABEL: name: test_add_f64_dpmacc_constraint ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr6 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1250-NEXT: $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_add_f64_dpmacc_constraint ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr6 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr6 = V_ADD_F32_e32 $vgpr6, $vgpr4, implicit $mode, implicit $exec $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 $vgpr0_vgpr1, $vgpr2_vgpr3, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_mul_f64_dpmacc_constraint tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-LABEL: name: test_mul_f64_dpmacc_constraint ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1250-NEXT: $vgpr4_vgpr5 = V_MUL_F64_pseudo_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_mul_f64_dpmacc_constraint ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr4_vgpr5 = V_MUL_F64_pseudo_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr6 = V_MUL_F32_e32 $vgpr6, $vgpr4, implicit $mode, implicit $exec $vgpr4_vgpr5 = V_MUL_F64_pseudo_e32 $vgpr0_vgpr1, $vgpr2_vgpr3, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_min_num_f64_dpmacc_constraint tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-LABEL: name: test_min_num_f64_dpmacc_constraint ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr6 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1250-NEXT: $vgpr4_vgpr5 = V_MIN_NUM_F64_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_min_num_f64_dpmacc_constraint ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr6 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr4, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr4_vgpr5 = V_MIN_NUM_F64_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr6 = V_ADD_F32_e32 $vgpr6, $vgpr4, implicit $mode, implicit $exec $vgpr4_vgpr5 = V_MIN_NUM_F64_e32 $vgpr0_vgpr1, $vgpr2_vgpr3, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_max_num_f64_dpmacc_constraint tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-LABEL: name: test_max_num_f64_dpmacc_constraint ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr7, killed $vgpr4, implicit $mode, implicit $exec ; GFX1250-NEXT: $vgpr4_vgpr5 = V_MAX_NUM_F64_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_max_num_f64_dpmacc_constraint ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr6 = V_MUL_F32_e32 killed $vgpr7, killed $vgpr4, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr4_vgpr5 = V_MAX_NUM_F64_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr6 = V_MUL_F32_e32 $vgpr7, $vgpr4, implicit $mode, implicit $exec $vgpr4_vgpr5 = V_MAX_NUM_F64_e32 $vgpr0_vgpr1, $vgpr2_vgpr3, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_non_dpmacc_antidep_allows_vopd tracksRegLiveness: true body: | bb.0: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3 ; GFX1250-LABEL: name: test_non_dpmacc_antidep_allows_vopd ; GFX1250: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr3, $vgpr2 = V_DUAL_ADD_F32_e32_X_MUL_F32_e32_gfx1250 killed $vgpr2, $vgpr2, killed $vgpr0, killed $vgpr1, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_non_dpmacc_antidep_allows_vopd ; GFX1200: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr3, $vgpr2 = V_DUAL_ADD_F32_e32_X_MUL_F32_e32_gfx12 killed $vgpr2, $vgpr2, killed $vgpr0, killed $vgpr1, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr3 = V_ADD_F32_e32 $vgpr2, $vgpr2, implicit $mode, implicit $exec $vgpr2 = V_MUL_F32_e32 $vgpr0, $vgpr1, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_fma_f64_no_write_dependency_forms_vopd tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6, $vgpr7 ; GFX1250-LABEL: name: test_fma_f64_no_write_dependency_forms_vopd ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6, $vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr8_vgpr9, $vgpr10 = V_DUAL_FMA_F64_e64_X_ADD_F32_e32_e96_gfx1250 0, $vgpr0_vgpr1, 0, killed $vgpr2_vgpr3, 0, killed $vgpr4_vgpr5, 0, killed $vgpr6, 0, killed $vgpr1, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_fma_f64_no_write_dependency_forms_vopd ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6, $vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr8_vgpr9 = V_FMA_F64_e64 0, $vgpr0_vgpr1, 0, killed $vgpr2_vgpr3, 0, killed $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr10 = V_ADD_F32_e32 killed $vgpr6, killed $vgpr1, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr8_vgpr9 = V_FMA_F64_e64 0, $vgpr0_vgpr1, 0, $vgpr2_vgpr3, 0, $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $exec $vgpr10 = V_ADD_F32_e32 $vgpr6, $vgpr1, implicit $mode, implicit $exec S_ENDPGM 0 ... --- name: test_add_f64_no_write_dependency_allows_vopd_gfx1250 tracksRegLiveness: true body: | bb.0: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7 ; GFX1250-LABEL: name: test_add_f64_no_write_dependency_allows_vopd_gfx1250 ; GFX1250: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7 ; GFX1250-NEXT: {{ $}} ; GFX1250-NEXT: $vgpr8_vgpr9, $vgpr10 = V_DUAL_ADD_F64_pseudo_e32_X_ADD_F32_e32_e96_gfx1250 0, killed $vgpr0_vgpr1, 0, killed $vgpr2_vgpr3, 0, killed $vgpr6, 0, $vgpr1, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec ; GFX1250-NEXT: S_ENDPGM 0 ; ; GFX1200-LABEL: name: test_add_f64_no_write_dependency_allows_vopd_gfx1250 ; GFX1200: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5, $vgpr6, $vgpr7 ; GFX1200-NEXT: {{ $}} ; GFX1200-NEXT: $vgpr10 = V_ADD_F32_e32 killed $vgpr6, $vgpr1, implicit $mode, implicit $exec ; GFX1200-NEXT: $vgpr8_vgpr9 = V_ADD_F64_pseudo_e32 killed $vgpr0_vgpr1, killed $vgpr2_vgpr3, implicit $mode, implicit $exec ; GFX1200-NEXT: S_ENDPGM 0 $vgpr10 = V_ADD_F32_e32 $vgpr6, $vgpr1, implicit $mode, implicit $exec $vgpr8_vgpr9 = V_ADD_F64_pseudo_e32 $vgpr0_vgpr1, $vgpr2_vgpr3, implicit $mode, implicit $exec S_ENDPGM 0 ...