1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.maxnum.f32(float, float) #0 4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.maxnum.v2f32(<2 x float>, <2 x float>) #0 5*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>) #0 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.maxnum.f64(double, double) #0 8*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>) #0 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 2.000000e+00 12*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32() #0 { 13*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 1.0, float 2.0) #0 14*9880d681SAndroid Build Coastguard Worker ret float %x 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_inv 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 2.000000e+00 19*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_inv() #0 { 20*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 2.0, float 1.0) #0 21*9880d681SAndroid Build Coastguard Worker ret float %x 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_nan0 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 2.000000e+00 26*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_nan0() #0 { 27*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float 2.0) #0 28*9880d681SAndroid Build Coastguard Worker ret float %x 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_nan1 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 2.000000e+00 33*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_nan1() #0 { 34*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 2.0, float 0x7FF8000000000000) #0 35*9880d681SAndroid Build Coastguard Worker ret float %x 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_nan_nan 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 0x7FF8000000000000 40*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_nan_nan() #0 { 41*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float 0x7FF8000000000000) #0 42*9880d681SAndroid Build Coastguard Worker ret float %x 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_p0_p0 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 0.000000e+00 47*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_p0_p0() #0 { 48*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 0.0, float 0.0) #0 49*9880d681SAndroid Build Coastguard Worker ret float %x 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_p0_n0 53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 0.000000e+00 54*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_p0_n0() #0 { 55*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float 0.0, float -0.0) #0 56*9880d681SAndroid Build Coastguard Worker ret float %x 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_n0_p0 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float -0.000000e+00 61*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_n0_p0() #0 { 62*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float -0.0, float 0.0) #0 63*9880d681SAndroid Build Coastguard Worker ret float %x 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f32_n0_n0 67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float -0.000000e+00 68*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_maxnum_f32_n0_n0() #0 { 69*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.maxnum.f32(float -0.0, float -0.0) #0 70*9880d681SAndroid Build Coastguard Worker ret float %x 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_v4f32 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> <float 2.000000e+00, float 8.000000e+00, float 1.000000e+01, float 9.000000e+00> 75*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @constant_fold_maxnum_v4f32() #0 { 76*9880d681SAndroid Build Coastguard Worker %x = call <4 x float> @llvm.maxnum.v4f32(<4 x float> <float 1.0, float 8.0, float 3.0, float 9.0>, <4 x float> <float 2.0, float 2.0, float 10.0, float 5.0>) 77*9880d681SAndroid Build Coastguard Worker ret <4 x float> %x 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f64 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 2.000000e+00 82*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_maxnum_f64() #0 { 83*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.maxnum.f64(double 1.0, double 2.0) #0 84*9880d681SAndroid Build Coastguard Worker ret double %x 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f64_nan0 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 2.000000e+00 89*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_maxnum_f64_nan0() #0 { 90*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.maxnum.f64(double 0x7FF8000000000000, double 2.0) #0 91*9880d681SAndroid Build Coastguard Worker ret double %x 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f64_nan1 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 2.000000e+00 96*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_maxnum_f64_nan1() #0 { 97*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.maxnum.f64(double 2.0, double 0x7FF8000000000000) #0 98*9880d681SAndroid Build Coastguard Worker ret double %x 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_maxnum_f64_nan_nan 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 0x7FF8000000000000 103*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_maxnum_f64_nan_nan() #0 { 104*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.maxnum.f64(double 0x7FF8000000000000, double 0x7FF8000000000000) #0 105*9880d681SAndroid Build Coastguard Worker ret double %x 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @canonicalize_constant_maxnum_f32 109*9880d681SAndroid Build Coastguard Worker; CHECK: call float @llvm.maxnum.f32(float %x, float 1.000000e+00) 110*9880d681SAndroid Build Coastguard Workerdefine float @canonicalize_constant_maxnum_f32(float %x) #0 { 111*9880d681SAndroid Build Coastguard Worker %y = call float @llvm.maxnum.f32(float 1.0, float %x) #0 112*9880d681SAndroid Build Coastguard Worker ret float %y 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @noop_maxnum_f32 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %x 117*9880d681SAndroid Build Coastguard Workerdefine float @noop_maxnum_f32(float %x) #0 { 118*9880d681SAndroid Build Coastguard Worker %y = call float @llvm.maxnum.f32(float %x, float %x) #0 119*9880d681SAndroid Build Coastguard Worker ret float %y 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_f32_nan_val 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %x 124*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_f32_nan_val(float %x) #0 { 125*9880d681SAndroid Build Coastguard Worker %y = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float %x) #0 126*9880d681SAndroid Build Coastguard Worker ret float %y 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_f32_val_nan 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %x 131*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_f32_val_nan(float %x) #0 { 132*9880d681SAndroid Build Coastguard Worker %y = call float @llvm.maxnum.f32(float %x, float 0x7FF8000000000000) #0 133*9880d681SAndroid Build Coastguard Worker ret float %y 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_maxnum_f32_undef_undef 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float undef 138*9880d681SAndroid Build Coastguard Workerdefine float @fold_maxnum_f32_undef_undef(float %x) nounwind { 139*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.maxnum.f32(float undef, float undef) #0 140*9880d681SAndroid Build Coastguard Worker ret float %val 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_maxnum_f32_val_undef 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %x 145*9880d681SAndroid Build Coastguard Workerdefine float @fold_maxnum_f32_val_undef(float %x) nounwind { 146*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.maxnum.f32(float %x, float undef) #0 147*9880d681SAndroid Build Coastguard Worker ret float %val 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_maxnum_f32_undef_val 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %x 152*9880d681SAndroid Build Coastguard Workerdefine float @fold_maxnum_f32_undef_val(float %x) nounwind { 153*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.maxnum.f32(float undef, float %x) #0 154*9880d681SAndroid Build Coastguard Worker ret float %val 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_x_maxnum_x_y 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y) 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 160*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_x_maxnum_x_y(float %x, float %y) #0 { 161*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.maxnum.f32(float %x, float %y) #0 162*9880d681SAndroid Build Coastguard Worker %b = call float @llvm.maxnum.f32(float %x, float %a) #0 163*9880d681SAndroid Build Coastguard Worker ret float %b 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_y_maxnum_x_y 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y) 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 169*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_y_maxnum_x_y(float %x, float %y) #0 { 170*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.maxnum.f32(float %x, float %y) #0 171*9880d681SAndroid Build Coastguard Worker %b = call float @llvm.maxnum.f32(float %y, float %a) #0 172*9880d681SAndroid Build Coastguard Worker ret float %b 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_z_maxnum_x_y 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y) 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %z, float %a) 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 179*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_z_maxnum_x_y(float %x, float %y, float %z) #0 { 180*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.maxnum.f32(float %x, float %y) #0 181*9880d681SAndroid Build Coastguard Worker %b = call float @llvm.maxnum.f32(float %z, float %a) #0 182*9880d681SAndroid Build Coastguard Worker ret float %b 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum_maxnum_x_y_z 186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y) 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %a, float %z) 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 189*9880d681SAndroid Build Coastguard Workerdefine float @maxnum_maxnum_x_y_z(float %x, float %y, float %z) #0 { 190*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.maxnum.f32(float %x, float %y) #0 191*9880d681SAndroid Build Coastguard Worker %b = call float @llvm.maxnum.f32(float %a, float %z) #0 192*9880d681SAndroid Build Coastguard Worker ret float %b 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @maxnum4 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y) 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %z, float %w) 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %a, float %b) 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 200*9880d681SAndroid Build Coastguard Workerdefine float @maxnum4(float %x, float %y, float %z, float %w) #0 { 201*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.maxnum.f32(float %x, float %y) #0 202*9880d681SAndroid Build Coastguard Worker %b = call float @llvm.maxnum.f32(float %z, float %w) #0 203*9880d681SAndroid Build Coastguard Worker %c = call float @llvm.maxnum.f32(float %a, float %b) #0 204*9880d681SAndroid Build Coastguard Worker ret float %c 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_maxnum_f32_inf_val 208*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 0x7FF0000000000000 209*9880d681SAndroid Build Coastguard Workerdefine float @fold_maxnum_f32_inf_val(float %x) nounwind { 210*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.maxnum.f32(float 0x7FF0000000000000, float %x) #0 211*9880d681SAndroid Build Coastguard Worker ret float %val 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_maxnum_f32_neginf_val 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float 0xFFF0000000000000) 216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 217*9880d681SAndroid Build Coastguard Workerdefine float @fold_maxnum_f32_neginf_val(float %x) nounwind { 218*9880d681SAndroid Build Coastguard Worker %val = call float @llvm.maxnum.f32(float 0xFFF0000000000000, float %x) #0 219*9880d681SAndroid Build Coastguard Worker ret float %val 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 223