Index: lib/Target/AMDGPU/SIFoldOperands.cpp =================================================================== --- lib/Target/AMDGPU/SIFoldOperands.cpp +++ lib/Target/AMDGPU/SIFoldOperands.cpp @@ -563,6 +563,21 @@ case AMDGPU::S_XOR_B32: Result = LHS ^ RHS; return true; + case AMDGPU::S_XNOR_B32: + Result = ~(LHS ^ RHS); + return true; + case AMDGPU::S_NAND_B32: + Result = ~(LHS & RHS); + return true; + case AMDGPU::S_NOR_B32: + Result = ~(LHS | RHS); + return true; + case AMDGPU::S_ANDN2_B32: + Result = LHS & ~RHS; + return true; + case AMDGPU::S_ORN2_B32: + Result = LHS | ~RHS; + return true; case AMDGPU::V_LSHL_B32_e64: case AMDGPU::V_LSHL_B32_e32: case AMDGPU::S_LSHL_B32: @@ -663,10 +678,16 @@ if (!Src0->isImm() && !Src1->isImm()) return false; - if (MI->getOpcode() == AMDGPU::V_LSHL_OR_B32) { + if (MI->getOpcode() == AMDGPU::V_LSHL_OR_B32 || + MI->getOpcode() == AMDGPU::V_LSHL_ADD_U32 || + MI->getOpcode() == AMDGPU::V_AND_OR_B32) { if (Src0->isImm() && Src0->getImm() == 0) { // v_lshl_or_b32 0, X, Y -> copy Y // v_lshl_or_b32 0, X, K -> v_mov_b32 K + // v_lshl_add_b32 0, X, Y -> copy Y + // v_lshl_add_b32 0, X, K -> v_mov_b32 K + // v_and_or_b32 0, X, Y -> copy Y + // v_and_or_b32 0, X, K -> v_mov_b32 K bool UseCopy = TII->getNamedOperand(*MI, AMDGPU::OpName::src2)->isReg(); MI->RemoveOperand(Src1Idx); MI->RemoveOperand(Src0Idx); Index: test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir =================================================================== --- test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir +++ test/CodeGen/AMDGPU/constant-fold-imm-immreg.mir @@ -163,6 +163,463 @@ ... --- +# GCN-LABEL: name: s_fold_andn2_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 1233024, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_andn2_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_ANDN2_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + +# GCN-LABEL: name: s_fold_or_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 1243023, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_or_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_OR_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + +# GCN-LABEL: name: v_fold_or_imm_regimm_32{{$}} + +# GCN: %9:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec +# GCN: FLAT_STORE_DWORD %19, %9, + +# GCN: %10:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec +# GCN: FLAT_STORE_DWORD %19, %10 + +# GCN: %11:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec +# GCN: FLAT_STORE_DWORD %19, %11, + +# GCN: %12:vgpr_32 = V_MOV_B32_e32 1234567, implicit $exec +# GCN: FLAT_STORE_DWORD %19, %12, + +# GCN: %13:vgpr_32 = V_MOV_B32_e32 63, implicit $exec +# GCN: FLAT_STORE_DWORD %19, %13, + +name: v_fold_or_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_32_xm0 } + - { id: 2, class: sgpr_32 } + - { id: 3, class: vgpr_32 } + - { id: 4, class: sreg_64_xexec } + - { id: 20, class: sreg_32_xm0 } + - { id: 24, class: vgpr_32 } + - { id: 25, class: vreg_64 } + - { id: 26, class: sreg_32_xm0 } + - { id: 27, class: vgpr_32 } + - { id: 28, class: vgpr_32 } + - { id: 29, class: vgpr_32 } + - { id: 30, class: vgpr_32 } + - { id: 31, class: vgpr_32 } + - { id: 32, class: vreg_64 } + - { id: 33, class: vreg_64 } + - { id: 34, class: vgpr_32 } + - { id: 35, class: vgpr_32 } + - { id: 36, class: vgpr_32 } + - { id: 37, class: vreg_64 } + - { id: 44, class: vgpr_32 } + +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } + - { reg: '$vgpr0', virtual-reg: '%3' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1, $vgpr0 + + %3 = COPY $vgpr0 + %0 = COPY $sgpr0_sgpr1 + %4 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %31 = V_ASHRREV_I32_e64 31, %3, implicit $exec + %32 = REG_SEQUENCE %3, 1, %31, 2 + %33 = V_LSHLREV_B64 2, killed %32, implicit $exec + %20 = COPY %4.sub1 + %44 = V_ADD_I32_e32 %4.sub0, %33.sub0, implicit-def $vcc, implicit $exec + %36 = COPY killed %20 + %35 = V_ADDC_U32_e32 %33.sub1, %36, implicit-def $vcc, implicit $vcc, implicit $exec + %37 = REG_SEQUENCE %44, 1, killed %35, 2 + %24 = V_MOV_B32_e32 982, implicit $exec + %26 = S_MOV_B32 1234567 + %34 = V_MOV_B32_e32 63, implicit $exec + + %27 = V_OR_B32_e64 %26, %24, implicit $exec + FLAT_STORE_DWORD %37, %27, 0, 0, 0, implicit $exec, implicit $flat_scr + + %28 = V_OR_B32_e64 %24, %26, implicit $exec + FLAT_STORE_DWORD %37, %28, 0, 0, 0, implicit $exec, implicit $flat_scr + + %29 = V_OR_B32_e32 %26, %24, implicit $exec + FLAT_STORE_DWORD %37, %29, 0, 0, 0, implicit $exec, implicit $flat_scr + + %30 = V_OR_B32_e64 %26, %26, implicit $exec + FLAT_STORE_DWORD %37, %30, 0, 0, 0, implicit $exec, implicit $flat_scr + + %31 = V_OR_B32_e64 %34, %34, implicit $exec + FLAT_STORE_DWORD %37, %31, 0, 0, 0, implicit $exec, implicit $flat_scr + + S_ENDPGM + +... +--- + +# GCN-LABEL: name: s_fold_orn2_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 -8457, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_orn2_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_ORN2_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + +# GCN-LABEL: name: s_fold_nand_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1544, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_nand_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_NAND_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + +# GCN-LABEL: name: s_fold_nor_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1243024, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_nor_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_NOR_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + +# GCN-LABEL: name: s_fold_xnor_imm_regimm_32{{$}} +# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1241481, implicit $exec +# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, +name: s_fold_xnor_imm_regimm_32 +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +registers: + - { id: 0, class: sgpr_64 } + - { id: 1, class: sreg_64_xexec } + - { id: 2, class: sreg_32_xm0 } + - { id: 3, class: sreg_32_xm0 } + - { id: 4, class: sreg_32_xm0 } + - { id: 5, class: sreg_32_xm0 } + - { id: 6, class: sreg_128 } + - { id: 7, class: sreg_32_xm0 } + - { id: 8, class: sreg_32_xm0 } + - { id: 9, class: sreg_32_xm0 } + - { id: 10, class: vgpr_32 } +liveins: + - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } +frameInfo: + isFrameAddressTaken: false + isReturnAddressTaken: false + hasStackMap: false + hasPatchPoint: false + stackSize: 0 + offsetAdjustment: 0 + maxAlignment: 0 + adjustsStack: false + hasCalls: false + maxCallFrameSize: 0 + hasOpaqueSPAdjustment: false + hasVAStart: false + hasMustTailInVarArgFunc: false +body: | + bb.0: + liveins: $sgpr0_sgpr1 + + %0 = COPY $sgpr0_sgpr1 + %1 = S_LOAD_DWORDX2_IMM %0, 36, 0 + %2 = COPY %1.sub1 + %3 = COPY %1.sub0 + %4 = S_MOV_B32 61440 + %5 = S_MOV_B32 -1 + %6 = REG_SEQUENCE killed %2, 1, killed %3, 2, killed %4, 3, killed %5, 4 + %7 = S_MOV_B32 1234567 + %8 = S_MOV_B32 9999 + %9 = S_XNOR_B32 killed %7, killed %8, implicit-def dead $scc + %10 = COPY %9 + BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec + S_ENDPGM + +... +--- + # GCN-LABEL: name: s_fold_shl_imm_regimm_32{{$}} # GC1: %13 = V_MOV_B32_e32 4096, implicit $exec # GCN: BUFFER_STORE_DWORD_OFFSET killed %13, @@ -903,3 +1360,149 @@ S_ENDPGM implicit %3 ... + +--- +# GCN-LABEL: name: constant_fold_lshl_add_reg0_immreg_reg{{$}} +# GCN: %2:vgpr_32 = COPY $vgpr0, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %2 + +name: constant_fold_lshl_add_reg0_immreg_reg +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + liveins: $vgpr0 + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_LSHL_ADD_U32 %0,%1, $vgpr0, implicit $exec + S_ENDPGM implicit %2 + +... + +--- + +# GCN-LABEL: name: constant_fold_lshl_add_reg0_immreg_imm{{$}} +# GCN: %2:vgpr_32 = V_MOV_B32_e32 10, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %2 + +name: constant_fold_lshl_add_reg0_immreg_imm +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_LSHL_ADD_U32 %0, %1, 10, implicit $exec + S_ENDPGM implicit %2 + +... + +--- + +# GCN-LABEL: name: constant_fold_lshl_add_reg0_immreg_immreg{{$}} +# GCN: %3:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %3 + +name: constant_fold_lshl_add_reg0_immreg_immreg +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec + %3:vgpr_32 = V_LSHL_ADD_U32 %0, %1, %2, implicit $exec + S_ENDPGM implicit %3 + +... + +--- +# GCN-LABEL: name: constant_fold_and_or_reg0_immreg_reg{{$}} +# GCN: %2:vgpr_32 = COPY $vgpr0, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %2 + +name: constant_fold_and_or_reg0_immreg_reg +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + liveins: $vgpr0 + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_AND_OR_B32 %0,%1, $vgpr0, implicit $exec + S_ENDPGM implicit %2 + +... + +--- + +# GCN-LABEL: name: constant_fold_and_or_reg0_immreg_imm{{$}} +# GCN: %2:vgpr_32 = V_MOV_B32_e32 10, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %2 + +name: constant_fold_and_or_reg0_immreg_imm +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_AND_OR_B32 %0, %1, 10, implicit $exec + S_ENDPGM implicit %2 + +... + +--- + +# GCN-LABEL: name: constant_fold_and_or_reg0_immreg_immreg{{$}} +# GCN: %3:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec, implicit $exec +# GCN-NEXT: S_ENDPGM implicit %3 + +name: constant_fold_and_or_reg0_immreg_immreg +alignment: 0 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true + +body: | + bb.0: + + %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec + %2:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec + %3:vgpr_32 = V_AND_OR_B32 %0, %1, %2, implicit $exec + S_ENDPGM implicit %3 + +...