323 lines · plain
1; RUN: opt < %s -passes=instcombine -S -mtriple=nvptx-nvidia-cuda -march=nvptx64 \2; RUN: -mcpu=sm_80 -mattr=+ptx70 | \3; RUN: FileCheck %s4 5declare half @llvm.nvvm.fmin.f16(half, half)6declare half @llvm.nvvm.fmin.ftz.f16(half, half)7declare <2 x half> @llvm.nvvm.fmin.f16x2(<2 x half>, <2 x half>)8declare <2 x half> @llvm.nvvm.fmin.ftz.f16x2(<2 x half>, <2 x half>)9declare float @llvm.nvvm.fmin.nan.f(float, float)10declare float @llvm.nvvm.fmin.ftz.nan.f(float, float)11declare half @llvm.nvvm.fmin.nan.f16(half, half)12declare half @llvm.nvvm.fmin.ftz.nan.f16(half, half)13declare <2 x half> @llvm.nvvm.fmin.nan.f16x2(<2 x half>, <2 x half>)14declare <2 x half> @llvm.nvvm.fmin.ftz.nan.f16x2(<2 x half>, <2 x half>)15 16declare half @llvm.nvvm.fmax.f16(half, half)17declare half @llvm.nvvm.fmax.ftz.f16(half, half)18declare <2 x half> @llvm.nvvm.fmax.f16x2(<2 x half>, <2 x half>)19declare <2 x half> @llvm.nvvm.fmax.ftz.f16x2(<2 x half>, <2 x half>)20declare float @llvm.nvvm.fmax.nan.f(float, float)21declare float @llvm.nvvm.fmax.ftz.nan.f(float, float)22declare half @llvm.nvvm.fmax.nan.f16(half, half)23declare half @llvm.nvvm.fmax.ftz.nan.f16(half, half)24declare <2 x half> @llvm.nvvm.fmax.nan.f16x2(<2 x half>, <2 x half>)25declare <2 x half> @llvm.nvvm.fmax.ftz.nan.f16x2(<2 x half>, <2 x half>)26 27; f16 and f16x2 fma are available since ptx 4.2 and sm_53.28declare half @llvm.nvvm.fma.rn.f16(half, half, half)29declare half @llvm.nvvm.fma.rn.ftz.f16(half, half, half)30declare <2 x half> @llvm.nvvm.fma.rn.f16x2(<2 x half>, <2 x half>, <2 x half>)31declare <2 x half> @llvm.nvvm.fma.rn.ftz.f16x2(<2 x half>, <2 x half>, <2 x half>)32 33; CHECK-LABEL: fmin_f1634define half @fmin_f16(half %0, half %1) {35 ; CHECK-NOT: @llvm.nvvm.fmin.f1636 ; CHECK: @llvm.minnum.f1637 %res = call half @llvm.nvvm.fmin.f16(half %0, half %1)38 ret half %res39}40 41; CHECK-LABEL: fmin_ftz_f1642define half @fmin_ftz_f16(half %0, half %1) #0 {43 ; CHECK-NOT: @llvm.nvvm.fmin.ftz.f1644 ; CHECK: @llvm.minnum.f1645 %res = call half @llvm.nvvm.fmin.ftz.f16(half %0, half %1)46 ret half %res47}48 49; CHECK-LABEL: fmin_ftz_f16_no_attr50define half @fmin_ftz_f16_no_attr(half %0, half %1) {51 ; CHECK-NOT: @llvm.minnum.f1652 ; CHECK: @llvm.nvvm.fmin.ftz.f1653 %res = call half @llvm.nvvm.fmin.ftz.f16(half %0, half %1)54 ret half %res55}56 57; CHECK-LABEL: fmin_f16x258define <2 x half> @fmin_f16x2(<2 x half> %0, <2 x half> %1) {59 ; CHECK-NOT: @llvm.nvvm.fmin.f16x260 ; CHECK: @llvm.minnum.v2f1661 %res = call <2 x half> @llvm.nvvm.fmin.f16x2(<2 x half> %0, <2 x half> %1)62 ret <2 x half> %res63}64 65; CHECK-LABEL: fmin_ftz_f16x266define <2 x half> @fmin_ftz_f16x2(<2 x half> %0, <2 x half> %1) #0 {67 ; CHECK-NOT: @llvm.nvvm.fmin.ftz.f16x268 ; CHECK: @llvm.minnum.v2f1669 %res = call <2 x half> @llvm.nvvm.fmin.ftz.f16x2(<2 x half> %0, <2 x half> %1)70 ret <2 x half> %res71}72 73; CHECK-LABEL: fmin_ftz_f16x2_no_attr74define <2 x half> @fmin_ftz_f16x2_no_attr(<2 x half> %0, <2 x half> %1) {75 ; CHECK-NOT: @llvm.minnum.v2f1676 ; CHECK: @llvm.nvvm.fmin.ftz.f16x277 %res = call <2 x half> @llvm.nvvm.fmin.ftz.f16x2(<2 x half> %0, <2 x half> %1)78 ret <2 x half> %res79}80 81; CHECK-LABEL: fmin_nan_f82define float @fmin_nan_f(float %0, float %1) {83 ; CHECK-NOT: @llvm.nvvm.fmin.nan.f84 ; CHECK: @llvm.minimum.f3285 %res = call float @llvm.nvvm.fmin.nan.f(float %0, float %1)86 ret float %res87}88 89; CHECK-LABEL: fmin_ftz_nan_f90define float @fmin_ftz_nan_f(float %0, float %1) #1 {91 ; CHECK-NOT: @llvm.nvvm.fmin.ftz.nan.f92 ; CHECK: @llvm.minimum.f3293 %res = call float @llvm.nvvm.fmin.ftz.nan.f(float %0, float %1)94 ret float %res95}96 97; CHECK-LABEL: fmin_ftz_nan_f_no_attr98define float @fmin_ftz_nan_f_no_attr(float %0, float %1) {99 ; CHECK: @llvm.nvvm.fmin.ftz.nan.f100 ; CHECK-NOT: @llvm.minimum.f32101 %res = call float @llvm.nvvm.fmin.ftz.nan.f(float %0, float %1)102 ret float %res103}104 105; CHECK-LABEL: fmin_nan_f16106define half @fmin_nan_f16(half %0, half %1) {107 ; CHECK-NOT: @llvm.nvvm.fmin.nan.f16108 ; CHECK: @llvm.minimum.f16109 %res = call half @llvm.nvvm.fmin.nan.f16(half %0, half %1)110 ret half %res111}112 113; CHECK-LABEL: fmin_ftz_nan_f16114define half @fmin_ftz_nan_f16(half %0, half %1) #0 {115 ; CHECK-NOT: @llvm.nvvm.fmin.ftz.nan.f16116 ; CHECK: @llvm.minimum.f16117 %res = call half @llvm.nvvm.fmin.ftz.nan.f16(half %0, half %1)118 ret half %res119}120 121; CHECK-LABEL: fmin_ftz_nan_f16_no_attr122define half @fmin_ftz_nan_f16_no_attr(half %0, half %1) {123 ; CHECK: @llvm.nvvm.fmin.ftz.nan.f16124 ; CHECK-NOT: @llvm.minimum.f16125 %res = call half @llvm.nvvm.fmin.ftz.nan.f16(half %0, half %1)126 ret half %res127}128 129; CHECK-LABEL: fmin_nan_f16x2130define <2 x half> @fmin_nan_f16x2(<2 x half> %0, <2 x half> %1) {131 ; CHECK-NOT: @llvm.nvvm.fmin.nan.f16x2132 ; CHECK: @llvm.minimum.v2f16133 %res = call <2 x half> @llvm.nvvm.fmin.nan.f16x2(<2 x half> %0, <2 x half> %1)134 ret <2 x half> %res135}136 137; CHECK-LABEL: fmin_ftz_nan_f16x2138define <2 x half> @fmin_ftz_nan_f16x2(<2 x half> %0, <2 x half> %1) #0 {139 ; CHECK-NOT: @llvm.nvvm.fmin.ftz.nan.f16x2140 ; CHECK: @llvm.minimum.v2f16141 %res = call <2 x half> @llvm.nvvm.fmin.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)142 ret <2 x half> %res143}144 145; CHECK-LABEL: fmin_ftz_nan_f16x2_no_attr146define <2 x half> @fmin_ftz_nan_f16x2_no_attr(<2 x half> %0, <2 x half> %1) {147 ; CHECK-NOT: @llvm.minimum.v2f16148 ; CHECK: @llvm.nvvm.fmin.ftz.nan.f16x2149 %res = call <2 x half> @llvm.nvvm.fmin.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)150 ret <2 x half> %res151}152 153; CHECK-LABEL: fmax_f16154define half @fmax_f16(half %0, half %1) {155 ; CHECK-NOT: @llvm.nvvm.fmax.f16156 ; CHECK: @llvm.maxnum.f16157 %res = call half @llvm.nvvm.fmax.f16(half %0, half %1)158 ret half %res159}160 161; CHECK-LABEL: fmax_ftz_f16162define half @fmax_ftz_f16(half %0, half %1) #0 {163 ; CHECK-NOT: @llvm.nvvm.fmax.ftz.f16164 ; CHECK: @llvm.maxnum.f16165 %res = call half @llvm.nvvm.fmax.ftz.f16(half %0, half %1)166 ret half %res167}168 169; CHECK-LABEL: fmax_ftz_f16_no_attr170define half @fmax_ftz_f16_no_attr(half %0, half %1) {171 ; CHECK-NOT: @llvm.maxnum.f16172 ; CHECK: @llvm.nvvm.fmax.ftz.f16173 %res = call half @llvm.nvvm.fmax.ftz.f16(half %0, half %1)174 ret half %res175}176 177; CHECK-LABEL: fmax_f16x2178define <2 x half> @fmax_f16x2(<2 x half> %0, <2 x half> %1) {179 ; CHECK-NOT: @llvm.nvvm.fmax.f16x2180 ; CHECK: @llvm.maxnum.v2f16181 %res = call <2 x half> @llvm.nvvm.fmax.f16x2(<2 x half> %0, <2 x half> %1)182 ret <2 x half> %res183}184 185; CHECK-LABEL: fmax_ftz_f16x2186define <2 x half> @fmax_ftz_f16x2(<2 x half> %0, <2 x half> %1) #0 {187 ; CHECK-NOT: @llvm.nvvm.fmax.ftz.f16x2188 ; CHECK: @llvm.maxnum.v2f16189 %res = call <2 x half> @llvm.nvvm.fmax.ftz.f16x2(<2 x half> %0, <2 x half> %1)190 ret <2 x half> %res191}192 193; CHECK-LABEL: fmax_ftz_f16x2_no_attr194define <2 x half> @fmax_ftz_f16x2_no_attr(<2 x half> %0, <2 x half> %1) {195 ; CHECK-NOT: @llvm.maxnum.v2f16196 ; CHECK: @llvm.nvvm.fmax.ftz.f16x2197 %res = call <2 x half> @llvm.nvvm.fmax.ftz.f16x2(<2 x half> %0, <2 x half> %1)198 ret <2 x half> %res199}200 201; CHECK-LABEL: fmax_nan_f202define float @fmax_nan_f(float %0, float %1) {203 ; CHECK-NOT: @llvm.nvvm.fmax.nan.f204 ; CHECK: @llvm.maximum.f32205 %res = call float @llvm.nvvm.fmax.nan.f(float %0, float %1)206 ret float %res207}208 209; CHECK-LABEL: fmax_ftz_nan_f210define float @fmax_ftz_nan_f(float %0, float %1) #1 {211 ; CHECK-NOT: @llvm.nvvm.fmax.ftz.nan.f212 ; CHECK: @llvm.maximum.f32213 %res = call float @llvm.nvvm.fmax.ftz.nan.f(float %0, float %1)214 ret float %res215}216 217; CHECK-LABEL: fmax_ftz_nan_f_no_attr218define float @fmax_ftz_nan_f_no_attr(float %0, float %1) {219 ; CHECK: @llvm.nvvm.fmax.ftz.nan.f220 ; CHECK-NOT: @llvm.maximum.f32221 %res = call float @llvm.nvvm.fmax.ftz.nan.f(float %0, float %1)222 ret float %res223}224 225; CHECK-LABEL: fmax_nan_f16226define half @fmax_nan_f16(half %0, half %1) {227 ; CHECK-NOT: @llvm.nvvm.fmax.nan.f16228 ; CHECK: @llvm.maximum.f16229 %res = call half @llvm.nvvm.fmax.nan.f16(half %0, half %1)230 ret half %res231}232 233; CHECK-LABEL: fmax_ftz_nan_f16234define half @fmax_ftz_nan_f16(half %0, half %1) #0 {235 ; CHECK-NOT: @llvm.nvvm.fmax.ftz.nan.f16236 ; CHECK: @llvm.maximum.f16237 %res = call half @llvm.nvvm.fmax.ftz.nan.f16(half %0, half %1)238 ret half %res239}240 241; CHECK-LABEL: fmax_ftz_nan_f16_no_attr242define half @fmax_ftz_nan_f16_no_attr(half %0, half %1) {243 ; CHECK: @llvm.nvvm.fmax.ftz.nan.f16244 ; CHECK-NOT: @llvm.maximum.f16245 %res = call half @llvm.nvvm.fmax.ftz.nan.f16(half %0, half %1)246 ret half %res247}248 249; CHECK-LABEL: fmax_nan_f16x2250define <2 x half> @fmax_nan_f16x2(<2 x half> %0, <2 x half> %1) {251 ; CHECK-NOT: @llvm.nvvm.fmax.nan.f16x2252 ; CHECK: @llvm.maximum.v2f16253 %res = call <2 x half> @llvm.nvvm.fmax.nan.f16x2(<2 x half> %0, <2 x half> %1)254 ret <2 x half> %res255}256 257; CHECK-LABEL: fmax_ftz_nan_f16x2258define <2 x half> @fmax_ftz_nan_f16x2(<2 x half> %0, <2 x half> %1) #0 {259 ; CHECK-NOT: @llvm.nvvm.fmax.ftz.nan.f16x2260 ; CHECK: @llvm.maximum.v2f16261 %res = call <2 x half> @llvm.nvvm.fmax.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)262 ret <2 x half> %res263}264 265; CHECK-LABEL: fmax_ftz_nan_f16x2_no_attr266define <2 x half> @fmax_ftz_nan_f16x2_no_attr(<2 x half> %0, <2 x half> %1) {267 ; CHECK-NOT: @llvm.maximum.v2f16268 ; CHECK: @llvm.nvvm.fmax.ftz.nan.f16x2269 %res = call <2 x half> @llvm.nvvm.fmax.ftz.nan.f16x2(<2 x half> %0, <2 x half> %1)270 ret <2 x half> %res271}272 273; CHECK-LABEL: fma_rn_f16274define half @fma_rn_f16(half %0, half %1, half %2) {275 ; CHECK-NOT: @llvm.nvvm.fma.rn.f16276 ; CHECK: @llvm.fma.f16277 %res = call half @llvm.nvvm.fma.rn.f16(half %0, half %1, half %2)278 ret half %res279}280 281; CHECK-LABEL: fma_rn_ftz_f16_no_attr282define half @fma_rn_ftz_f16_no_attr(half %0, half %1, half %2) {283 ; CHECK-NOT: @llvm.fma.f16284 ; CHECK: @llvm.nvvm.fma.rn.ftz.f16285 %res = call half @llvm.nvvm.fma.rn.ftz.f16(half %0, half %1, half %2)286 ret half %res287}288 289; CHECK-LABEL: fma_rn_ftz_f16290define half @fma_rn_ftz_f16(half %0, half %1, half %2) #0 {291 ; CHECK-NOT: @llvm.nvvm.fma.rn.ftz.f16292 ; CHECK: @llvm.fma.f16293 %res = call half @llvm.nvvm.fma.rn.ftz.f16(half %0, half %1, half %2)294 ret half %res295}296 297; CHECK-LABEL: fma_rn_f16x2298define <2 x half> @fma_rn_f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2) {299 ; CHECK-NOT: @llvm.nvvm.fma.rn.f16x2300 ; CHECK: @llvm.fma.v2f16301 %res = call <2 x half> @llvm.nvvm.fma.rn.f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2)302 ret <2 x half> %res303}304 305; CHECK-LABEL: fma_rn_ftz_f16x2306define <2 x half> @fma_rn_ftz_f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2) #0 {307 ; CHECK-NOT: @llvm.nvvm.fma.rn.ftz.f16x2308 ; CHECK: @llvm.fma.v2f16309 %res = call <2 x half> @llvm.nvvm.fma.rn.ftz.f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2)310 ret <2 x half> %res311}312 313; CHECK-LABEL: fma_rn_ftz_f16x2_no_attr314define <2 x half> @fma_rn_ftz_f16x2_no_attr(<2 x half> %0, <2 x half> %1, <2 x half> %2) {315 ; CHECK-NOT: @llvm.fma.v2f16316 ; CHECK: @llvm.nvvm.fma.rn.ftz.f16x2317 %res = call <2 x half> @llvm.nvvm.fma.rn.ftz.f16x2(<2 x half> %0, <2 x half> %1, <2 x half> %2)318 ret <2 x half> %res319}320 321attributes #0 = { "denormal-fp-math"="preserve-sign" }322attributes #1 = { "denormal-fp-math-f32"="preserve-sign" }323