Index: lib/Target/AMDGPU/SIInstrFormats.td =================================================================== --- lib/Target/AMDGPU/SIInstrFormats.td +++ lib/Target/AMDGPU/SIInstrFormats.td @@ -69,9 +69,6 @@ let TSFlags{20} = WQM; let TSFlags{21} = VGPRSpill; - // Most instructions require adjustments after selection to satisfy - // operand requirements. - let hasPostISelHook = 1; let SchedRW = [Write32Bit]; } @@ -137,6 +134,11 @@ let isCodeGenOnly = 0; int Size = 8; + + // Because SGPRs may be allowed if there are multiple operands, we + // need a post-isel hook to insert copies in order to avoid + // violating constant bus requirements. + let hasPostISelHook = 1; } } // End Uses = [EXEC] Index: lib/Target/AMDGPU/SIInstrInfo.td =================================================================== --- lib/Target/AMDGPU/SIInstrInfo.td +++ lib/Target/AMDGPU/SIInstrInfo.td @@ -2012,12 +2012,14 @@ dag ins = (ins VGPR_32:$addr, rc:$data0, ds_offset:$offset, gds:$gds), string asm = opName#" $vdst, $addr, $data0"#"$offset$gds"> { - def "" : DS_Pseudo , - AtomicNoRet; + let hasPostISelHook = 1 in { + def "" : DS_Pseudo , + AtomicNoRet; - let data1 = 0 in { - def _si : DS_Off16_Real_si ; - def _vi : DS_Off16_Real_vi ; + let data1 = 0 in { + def _si : DS_Off16_Real_si ; + def _vi : DS_Off16_Real_vi ; + } } } @@ -2026,11 +2028,13 @@ dag outs = (outs rc:$vdst), string asm = opName#" $vdst, $addr, $data0, $data1"#"$offset"#"$gds"> { - def "" : DS_Pseudo , - AtomicNoRet; + let hasPostISelHook = 1 in { + def "" : DS_Pseudo , + AtomicNoRet; - def _si : DS_Off16_Real_si ; - def _vi : DS_Off16_Real_vi ; + def _si : DS_Off16_Real_si ; + def _vi : DS_Off16_Real_vi ; + } } multiclass DS_1A2D_RET op, string asm, RegisterClass rc, @@ -2495,6 +2499,7 @@ name#" $vdst, $addr, $data glc"#"$slc"#"$tfe", []>, AtomicNoRet { let glc = 1; + let hasPostISelHook = 1; } } }