1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) #0 4*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fmuladd.f32(float, float, float) #0 5*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>) #0 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) #0 8*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fmuladd.f64(double, double, double) #0 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double) #0 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_fma_f32 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 6.000000e+00 15*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_fma_f32() #0 { 16*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.fma.f32(float 1.0, float 2.0, float 4.0) #0 17*9880d681SAndroid Build Coastguard Worker ret float %x 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_fma_v4f32 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <4 x float> <float 1.200000e+01, float 1.400000e+01, float 1.600000e+01, float 1.800000e+01> 22*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @constant_fold_fma_v4f32() #0 { 23*9880d681SAndroid Build Coastguard Worker %x = call <4 x float> @llvm.fma.v4f32(<4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, <4 x float> <float 2.0, float 2.0, float 2.0, float 2.0>, <4 x float> <float 10.0, float 10.0, float 10.0, float 10.0>) 24*9880d681SAndroid Build Coastguard Worker ret <4 x float> %x 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_fmuladd_f32 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float 6.000000e+00 29*9880d681SAndroid Build Coastguard Workerdefine float @constant_fold_fmuladd_f32() #0 { 30*9880d681SAndroid Build Coastguard Worker %x = call float @llvm.fmuladd.f32(float 1.0, float 2.0, float 4.0) #0 31*9880d681SAndroid Build Coastguard Worker ret float %x 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_fma_f64 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 6.000000e+00 36*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_fma_f64() #0 { 37*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.fma.f64(double 1.0, double 2.0, double 4.0) #0 38*9880d681SAndroid Build Coastguard Worker ret double %x 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_fmuladd_f64 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double 6.000000e+00 43*9880d681SAndroid Build Coastguard Workerdefine double @constant_fold_fmuladd_f64() #0 { 44*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.fmuladd.f64(double 1.0, double 2.0, double 4.0) #0 45*9880d681SAndroid Build Coastguard Worker ret double %x 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; The sqrt intrinsic is undefined for negative inputs besides -0.0. 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bad_sqrt 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double undef 51*9880d681SAndroid Build Coastguard Workerdefine double @bad_sqrt() { 52*9880d681SAndroid Build Coastguard Worker %x = call double @llvm.sqrt.f64(double -2.000000e+00) 53*9880d681SAndroid Build Coastguard Worker ret double %x 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 57