From 0f6af2352e4e29c3483b3e9f14bdc05d70e01a3f Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 17 Feb 2017 19:49:10 +0000 Subject: [PATCH] AMDGPU: Fix crashes on invalid icmp/fcmp intrinsics git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295489 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AMDGPU/SIISelLowering.cpp | 14 +++++++++----- test/CodeGen/AMDGPU/llvm.amdgcn.fcmp.ll | 8 ++++++++ test/CodeGen/AMDGPU/llvm.amdgcn.icmp.ll | 9 +++++++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/Target/AMDGPU/SIISelLowering.cpp b/lib/Target/AMDGPU/SIISelLowering.cpp index 1b18f38d198..6cfa3440e8a 100644 --- a/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/lib/Target/AMDGPU/SIISelLowering.cpp @@ -2767,10 +2767,12 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, } case Intrinsic::amdgcn_icmp: { const auto *CD = dyn_cast(Op.getOperand(3)); - int CondCode = CD->getSExtValue(); + if (!CD) + return DAG.getUNDEF(VT); + int CondCode = CD->getSExtValue(); if (CondCode < ICmpInst::Predicate::FIRST_ICMP_PREDICATE || - CondCode >= ICmpInst::Predicate::BAD_ICMP_PREDICATE) + CondCode > ICmpInst::Predicate::LAST_ICMP_PREDICATE) return DAG.getUNDEF(VT); ICmpInst::Predicate IcInput = static_cast(CondCode); @@ -2780,10 +2782,12 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, } case Intrinsic::amdgcn_fcmp: { const auto *CD = dyn_cast(Op.getOperand(3)); - int CondCode = CD->getSExtValue(); + if (!CD) + return DAG.getUNDEF(VT); - if (CondCode <= FCmpInst::Predicate::FCMP_FALSE || - CondCode >= FCmpInst::Predicate::FCMP_TRUE) + int CondCode = CD->getSExtValue(); + if (CondCode < FCmpInst::Predicate::FIRST_FCMP_PREDICATE || + CondCode > FCmpInst::Predicate::LAST_FCMP_PREDICATE) return DAG.getUNDEF(VT); FCmpInst::Predicate IcInput = static_cast(CondCode); diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.fcmp.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.fcmp.ll index 427ad5ef553..42a252d35d2 100644 --- a/test/CodeGen/AMDGPU/llvm.amdgcn.fcmp.ll +++ b/test/CodeGen/AMDGPU/llvm.amdgcn.fcmp.ll @@ -5,6 +5,14 @@ declare i64 @llvm.amdgcn.fcmp.f32(float, float, i32) #0 declare i64 @llvm.amdgcn.fcmp.f64(double, double, i32) #0 declare float @llvm.fabs.f32(float) #0 +; GCN-LABEL: {{^}}v_fcmp_f32_dynamic_cc: +; GCN: s_endpgm +define void @v_fcmp_f32_dynamic_cc(i64 addrspace(1)* %out, float %src0, float %src1, i32 %cc) { + %result = call i64 @llvm.amdgcn.fcmp.f32(float %src0, float %src1, i32 %cc) + store i64 %result, i64 addrspace(1)* %out + ret void +} + ; GCN-LABEL: {{^}}v_fcmp_f32_oeq_with_fabs: ; GCN: v_cmp_eq_f32_e64 {{s\[[0-9]+:[0-9]+\]}}, |{{v[0-9]+}}|, {{s[0-9]+}} define void @v_fcmp_f32_oeq_with_fabs(i64 addrspace(1)* %out, float %src, float %a) { diff --git a/test/CodeGen/AMDGPU/llvm.amdgcn.icmp.ll b/test/CodeGen/AMDGPU/llvm.amdgcn.icmp.ll index 6d0457bc648..987a41bc1f9 100644 --- a/test/CodeGen/AMDGPU/llvm.amdgcn.icmp.ll +++ b/test/CodeGen/AMDGPU/llvm.amdgcn.icmp.ll @@ -4,6 +4,15 @@ declare i64 @llvm.amdgcn.icmp.i32(i32, i32, i32) #0 declare i64 @llvm.amdgcn.icmp.i64(i64, i64, i32) #0 +; No crash on invalid input +; GCN-LABEL: {{^}}v_icmp_i32_dynamic_cc: +; GCN: s_endpgm +define void @v_icmp_i32_dynamic_cc(i64 addrspace(1)* %out, i32 %src, i32 %cc) { + %result = call i64 @llvm.amdgcn.icmp.i32(i32 %src, i32 100, i32 %cc) + store i64 %result, i64 addrspace(1)* %out + ret void +} + ; GCN-LABEL: {{^}}v_icmp_i32_eq: ; GCN: v_cmp_eq_u32_e64 define void @v_icmp_i32_eq(i64 addrspace(1)* %out, i32 %src) {