Index: llvm/lib/Target/AMDGPU/SIInstructions.td =================================================================== --- llvm/lib/Target/AMDGPU/SIInstructions.td +++ llvm/lib/Target/AMDGPU/SIInstructions.td @@ -2600,6 +2600,48 @@ (i32 (EXTRACT_SUBREG SReg_64:$y, sub1))), sub1) >; +// min(min(x, y), z)) or max(max(x, y), z)) -> min3(x, y, z) or max3(x, y, z) +class Int32Min3OrMax3Pat : AMDGPUPat < + (DivergentBinFrag (min_or_max_oneuse i32:$src0, i32:$src1), + i32:$src2), + (min3_or_max3 VSrc_b32:$src0, VSrc_b32:$src1, VSrc_b32:$src2) +>; + +class Int16Min3OrMax3Pat : GCNPat < + (DivergentBinFrag (min_or_max_oneuse i16:$src0, i16:$src1), + i16:$src2), + (min3_or_max3 SRCMODS.NONE, VSrc_b16:$src0, SRCMODS.NONE, VSrc_b16:$src1, + SRCMODS.NONE, VSrc_b16:$src2, DSTCLAMP.NONE, DSTOMOD.NONE) +>; + +class FPMin3OrMax3Pat : GCNPat < + (min_or_max (min_or_max_oneuse (VOP3Mods vt:$src0, i32:$src0_mods), + (VOP3Mods vt:$src1, i32:$src1_mods)), + (vt (VOP3Mods vt:$src2, i32:$src2_mods))), + (min3_or_max3 $src0_mods, $src0, $src1_mods, $src1, $src2_mods, $src2, + DSTCLAMP.NONE, DSTOMOD.NONE) +>; + +def : Int32Min3OrMax3Pat; +def : Int32Min3OrMax3Pat; +def : Int32Min3OrMax3Pat; +def : Int32Min3OrMax3Pat; +def : FPMin3OrMax3Pat; +def : FPMin3OrMax3Pat; + +let SubtargetPredicate = isGFX9Plus in { +def : Int16Min3OrMax3Pat; +def : Int16Min3OrMax3Pat; +def : Int16Min3OrMax3Pat; +def : Int16Min3OrMax3Pat; +def : FPMin3OrMax3Pat; +def : FPMin3OrMax3Pat; +} + multiclass IntMed3Pat