brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 714cac1 Raw
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