数值检查通过 # fusion 段的指令统计 dma.strided: 2 por: 8 sadd.s32: 8 sand.u32: 4 shalt: 4 simm.s32: 4 slt.s32: 8 sne.s32: 4 vld.8x128: 8 vmul.8x128.f32: 8 vst.8x128: 8 vsyncadd.s32: 2 vsyncpa.u1: 3 vwait.ge: 2 # fusion 段 # entry bundle: %broadcast_multiply_fusion = fusion(%x.1) { misc: vsyncpa.u1 [sflag:52], 0 } { s0: sand.u32 s8, 0x7fffffff, s0 ; s1: sadd.s32 s12, 64, s0 ; misc: vsyncpa.u1 [sflag:53], 0 } { s0: sadd.s32 s9, 64, s8 ; s1: slt.s32 p1, s8, s0 } { s0: sne.s32 p0, s8, s9 ; s1: slt.s32 p2, s12, s9 } { s0: por p3, p2, p1 } { s0: por p4, !p3, !p0 } { s0: @!p4 shalt } # BoundsCheck 0 [deref of opnd#0] for dma.hbm_to_vmem\nhlo: broadcast_multiply_fusion { s0: simm.s32 s15, 2147483647 ; # materialized constant s1: simm.s32 s18, 0 ; # materialized constant .encoding { s1.y = lo(imm2) } } { s0: sand.u32 s16, 0x0, s15 ; s1: sadd.s32 s19, 64, s18 ; .encoding { s0.y = lo(imm0) } } { s0: sadd.s32 s17, 64, s16 ; s1: slt.s32 p6, s16, 0 ; .encoding { s1.y = lo(imm0) } } { s0: sne.s32 p5, s16, s17 ; s1: slt.s32 p7, s19, s17 } { s0: por p8, p7, p6 } { s0: por p9, !p8, !p5 } { s0: @!p9 shalt } # BoundsCheck 0 [deref of opnd#2] for dma.hbm_to_vmem\nhlo: broadcast_multiply_fusion { s0: simm.s32 s20, 8 } # materialized constant { s0: dma.strided [vmem:s18], [hbm:s0], length=64, dst_stride=s20, src_stride=s20, elements_per_stride=s20, dst_flag=[sflag:52] } # base_bounds: (8, 1)\ndynamic_base_bounds: (8, 1)\nwindow_bounds: (8, 1)\niteration_bounds: (1, 1)\nstrides: (8, 1)\npad_low: (0, 0)\npad_high: (0, 0)\nelement_size_in_bytes: 4096\nsecond_minor_factor: 1 { misc: vwait.ge [sflag:52], 64 ; # pipeline-emitter-dma-wait .encoding { misc.value = imm2 } } { s0: sand.u32 s0, 0x40, s15 ; s1: simm.s32 s24, 64 ; # materialized constant vld: vld.8x128 v0, [vmem:0x0] ; misc: vsyncadd.s32 [sflag:52], -64 ; # pipeline-emitter-dma-wait .encoding { misc.value = imm2 ; s1.y = lo(imm0) } } { s0: sadd.s32 s23, 64, s0 ; s1: sadd.s32 s25, 64, s24 ; va0: vmul.8x128.f32 v1, 2.0, v0 ; vld: vld.8x128 v2, [vmem:0x8] } { s0: sne.s32 p10, s0, s23 ; s1: slt.s32 p11, s0, 64 ; va0: vmul.8x128.f32 v3, 2.0, v2 ; vld: vld.8x128 v4, [vmem:0x10] ; .encoding { s1.y = lo(imm0) } } { s0: slt.s32 p12, s25, s23 ; va0: vmul.8x128.f32 v5, 2.0, v4 ; vst: vst.8x128 [vmem:0x40], v1 ; vld: vld.8x128 v6, [vmem:0x18] ; .encoding { vst.offset = imm2 } } { s0: por p13, p12, p11 ; va0: vmul.8x128.f32 v7, 2.0, v6 ; vst: vst.8x128 [vmem:0x48], v3 ; vld: vld.8x128 v8, [vmem:0x20] ; .encoding { vst.offset = imm2 } } { s0: por p14, !p13, !p10 ; va0: vmul.8x128.f32 v9, 2.0, v8 ; vst: vst.8x128 [vmem:0x50], v5 ; vld: vld.8x128 v10, [vmem:0x28] ; .encoding { vst.offset = imm2 } } { va0: vmul.8x128.f32 v11, 2.0, v10 ; vst: vst.8x128 [vmem:0x58], v7 ; vld: vld.8x128 v12, [vmem:0x30] ; .encoding { vst.offset = imm2 } } { va0: vmul.8x128.f32 v13, 2.0, v12 ; vst: vst.8x128 [vmem:0x60], v9 ; vld: vld.8x128 v14, [vmem:0x38] ; .encoding { vst.offset = imm2 } } { va0: vmul.8x128.f32 v15, 2.0, v14 ; vst: vst.8x128 [vmem:0x68], v11 } { vst: vst.8x128 [vmem:0x70], v13 } { vst: vst.8x128 [vmem:0x78], v15 } { s0: @!p14 shalt } # BoundsCheck 17 [deref of opnd#0] for dma.vmem_to_hbm\nhlo: broadcast_multiply_fusion { s0: sand.u32 s28, 0x7fffffff, s1 ; s1: sadd.s32 s3, 64, s1 } { s0: sadd.s32 s29, 64, s28 ; s1: slt.s32 p1, s28, s1 } { s0: sne.s32 p0, s28, s29 ; s1: slt.s32 p2, s3, s29 } { s0: por p3, p2, p1 } { s0: por p4, !p3, !p0 } { s0: @!p4 shalt } # BoundsCheck 17 [deref of opnd#2] for dma.vmem_to_hbm\nhlo: broadcast_multiply_fusion { s0: dma.strided [hbm:s1], [vmem:s24], length=64, dst_stride=s20, src_stride=s20, elements_per_stride=s20, dst_flag=[sflag:53] } # base_bounds: (8, 1)\ndynamic_base_bounds: (8, 1)\nwindow_bounds: (8, 1)\niteration_bounds: (1, 1)\nstrides: (8, 1)\npad_low: (0, 0)\npad_high: (0, 0)\nelement_size_in_bytes: 4096\nsecond_minor_factor: 1 { misc: vwait.ge [sflag:53], 64 ; # pipeline-emitter-dma-wait .encoding { misc.value = imm2 } } { misc: vsyncadd.s32 [sflag:53], -64 ; # pipeline-emitter-dma-wait .encoding { misc.value = imm2 } } { misc: vsyncpa.u1 [sflag:52], 1 ; .encoding { misc.value = imm2 } } # exit bundle: %broadcast_multiply_fusion = fusion(%x.1)