From d259668731f4a7d6f477cefff102fe1e0b86f461 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 26 May 2020 21:56:53 -0400 Subject: [PATCH] AMDGPU: Set mayRaiseFPException This may be missing a few overrides to set it off still in some special cases. Since the flags set during selection should now be reliably preserved, this should not change codegen for non-strictfp functions. --- llvm/lib/Target/AMDGPU/VOP1Instructions.td | 3 +-- llvm/lib/Target/AMDGPU/VOP2Instructions.td | 9 +++++++-- llvm/lib/Target/AMDGPU/VOP3Instructions.td | 1 + llvm/lib/Target/AMDGPU/VOPInstructions.td | 12 +++--------- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/VOP1Instructions.td b/llvm/lib/Target/AMDGPU/VOP1Instructions.td index d11e798..c83442a 100644 --- a/llvm/lib/Target/AMDGPU/VOP1Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP1Instructions.td @@ -50,8 +50,7 @@ class VOP1_Pseudo pattern=[], bit VOP1On let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); - // FIXME - // let mayRaiseFPException = ReadsModeReg; + let mayRaiseFPException = ReadsModeReg; let VOP1 = 1; let VALU = 1; diff --git a/llvm/lib/Target/AMDGPU/VOP2Instructions.td b/llvm/lib/Target/AMDGPU/VOP2Instructions.td index 86dc179..74ae812 100644 --- a/llvm/lib/Target/AMDGPU/VOP2Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP2Instructions.td @@ -71,8 +71,7 @@ class VOP2_Pseudo pattern=[], string suf let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); - // FIXME: Set this - // let mayRaiseFPException = ReadsModeReg; + let mayRaiseFPException = ReadsModeReg; let VOP2 = 1; let VALU = 1; @@ -489,12 +488,14 @@ defm V_AND_B32 : VOP2Inst <"v_and_b32", VOP_PAT_GEN, and>; defm V_OR_B32 : VOP2Inst <"v_or_b32", VOP_PAT_GEN, or>; defm V_XOR_B32 : VOP2Inst <"v_xor_b32", VOP_PAT_GEN, xor>; +let mayRaiseFPException = 0 in { let Constraints = "$vdst = $src2", DisableEncoding="$src2", isConvertibleToThreeAddress = 1 in { defm V_MAC_F32 : VOP2Inst <"v_mac_f32", VOP_MAC_F32>; } def V_MADAK_F32 : VOP2_Pseudo <"v_madak_f32", VOP_MADAK_F32, []>; +} // No patterns so that the scalar instructions are always selected. // The scalar versions will be replaced with vector when needed later. @@ -633,7 +634,11 @@ defm V_ADD_F16 : VOP2Inst <"v_add_f16", VOP_F16_F16_F16, fadd>; defm V_SUB_F16 : VOP2Inst <"v_sub_f16", VOP_F16_F16_F16, fsub>; defm V_SUBREV_F16 : VOP2Inst <"v_subrev_f16", VOP_F16_F16_F16, null_frag, "v_sub_f16">; defm V_MUL_F16 : VOP2Inst <"v_mul_f16", VOP_F16_F16_F16, fmul>; + +let mayRaiseFPException = 0 in { def V_MADAK_F16 : VOP2_Pseudo <"v_madak_f16", VOP_MADAK_F16, [], "">; +} + } // End FPDPRounding = 1 defm V_ADD_U16 : VOP2Inst <"v_add_u16", VOP_I16_I16_I16_ARITH, add>; defm V_SUB_U16 : VOP2Inst <"v_sub_u16" , VOP_I16_I16_I16_ARITH, sub>; diff --git a/llvm/lib/Target/AMDGPU/VOP3Instructions.td b/llvm/lib/Target/AMDGPU/VOP3Instructions.td index 66a4e62..e9fb289 100644 --- a/llvm/lib/Target/AMDGPU/VOP3Instructions.td +++ b/llvm/lib/Target/AMDGPU/VOP3Instructions.td @@ -228,6 +228,7 @@ def VOP3b_I64_I1_I32_I32_I64 : VOPProfile<[i64, i32, i32, i64]> { class VOP3Interp pattern = []> : VOP3_Pseudo { let AsmMatchConverter = "cvtVOP3Interp"; + let mayRaiseFPException = 0; } def VOP3_INTERP : VOPProfile<[f32, f32, i32, untyped]> { diff --git a/llvm/lib/Target/AMDGPU/VOPInstructions.td b/llvm/lib/Target/AMDGPU/VOPInstructions.td index d52ad7f..f8a83e5 100644 --- a/llvm/lib/Target/AMDGPU/VOPInstructions.td +++ b/llvm/lib/Target/AMDGPU/VOPInstructions.td @@ -122,9 +122,7 @@ class VOP3_Pseudo pattern = [], let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); - // FIXME: Set this. Right now it seems regular IR operations don't - // automatically imply no FP exceptions. - // let mayRaiseFPException = ReadsModeReg; + let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); let AsmVariantName = AMDGPUAsmVariants.VOP3; @@ -500,9 +498,7 @@ class VOP_SDWA_Pseudo pattern=[]> : let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); - // FIXME: Set this. Right now it seems regular IR operations don't - // automatically imply no FP exceptions. - // let mayRaiseFPException = ReadsModeReg; + let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); let SubtargetPredicate = HasSDWA; @@ -623,9 +619,7 @@ class VOP_DPP_Pseudo pattern=[]> : let ReadsModeReg = !or(isFloatType.ret, isFloatType.ret); - // FIXME: Set this. Right now it seems regular IR operations don't - // automatically imply no FP exceptions. - // let mayRaiseFPException = ReadsModeReg; + let mayRaiseFPException = ReadsModeReg; let Uses = !if(ReadsModeReg, [MODE, EXEC], [EXEC]); let isConvergent = 1; -- 2.7.4