1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -instcombine -S | FileCheck %s 3 4declare double @llvm.cos.f64(double %Val) 5declare float @llvm.cos.f32(float %Val) 6declare <2 x float> @llvm.cos.v2f32(<2 x float> %Val) 7 8declare float @llvm.fabs.f32(float %Val) 9declare <2 x float> @llvm.fabs.v2f32(<2 x float> %Val) 10 11define double @undef_arg() { 12; CHECK-LABEL: @undef_arg( 13; CHECK-NEXT: ret double 0.000000e+00 14; 15 %r = call double @llvm.cos.f64(double undef) 16 ret double %r 17} 18 19define float @undef_arg2(float %d) { 20; CHECK-LABEL: @undef_arg2( 21; CHECK-NEXT: [[COSVAL:%.*]] = call float @llvm.cos.f32(float [[D:%.*]]) 22; CHECK-NEXT: [[FSUM:%.*]] = fadd float [[COSVAL]], 0.000000e+00 23; CHECK-NEXT: ret float [[FSUM]] 24; 25 %cosval = call float @llvm.cos.f32(float %d) 26 %cosval2 = call float @llvm.cos.f32(float undef) 27 %fsum = fadd float %cosval2, %cosval 28 ret float %fsum 29} 30 31define float @fneg_f32(float %x) { 32; CHECK-LABEL: @fneg_f32( 33; CHECK-NEXT: [[COS:%.*]] = call float @llvm.cos.f32(float [[X:%.*]]) 34; CHECK-NEXT: ret float [[COS]] 35; 36 %x.fneg = fsub float -0.0, %x 37 %cos = call float @llvm.cos.f32(float %x.fneg) 38 ret float %cos 39} 40 41define float @unary_fneg_f32(float %x) { 42; CHECK-LABEL: @unary_fneg_f32( 43; CHECK-NEXT: [[COS:%.*]] = call float @llvm.cos.f32(float [[X:%.*]]) 44; CHECK-NEXT: ret float [[COS]] 45; 46 %x.fneg = fneg float %x 47 %cos = call float @llvm.cos.f32(float %x.fneg) 48 ret float %cos 49} 50 51define <2 x float> @fneg_v2f32(<2 x float> %x) { 52; CHECK-LABEL: @fneg_v2f32( 53; CHECK-NEXT: [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 54; CHECK-NEXT: ret <2 x float> [[COS]] 55; 56 %x.fneg = fsub <2 x float> <float -0.0, float -0.0>, %x 57 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fneg) 58 ret <2 x float> %cos 59} 60 61define <2 x float> @unary_fneg_v2f32(<2 x float> %x) { 62; CHECK-LABEL: @unary_fneg_v2f32( 63; CHECK-NEXT: [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 64; CHECK-NEXT: ret <2 x float> [[COS]] 65; 66 %x.fneg = fneg <2 x float> %x 67 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fneg) 68 ret <2 x float> %cos 69} 70 71; FMF are not required, but they should propagate. 72 73define <2 x float> @fneg_cos_fmf(<2 x float> %x){ 74; CHECK-LABEL: @fneg_cos_fmf( 75; CHECK-NEXT: [[R:%.*]] = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 76; CHECK-NEXT: ret <2 x float> [[R]] 77; 78 %negx = fsub fast <2 x float> <float -0.0, float -0.0>, %x 79 %r = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> %negx) 80 ret <2 x float> %r 81} 82 83define <2 x float> @unary_fneg_cos_fmf(<2 x float> %x){ 84; CHECK-LABEL: @unary_fneg_cos_fmf( 85; CHECK-NEXT: [[R:%.*]] = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 86; CHECK-NEXT: ret <2 x float> [[R]] 87; 88 %negx = fneg fast <2 x float> %x 89 %r = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> %negx) 90 ret <2 x float> %r 91} 92 93define float @fabs_f32(float %x) { 94; CHECK-LABEL: @fabs_f32( 95; CHECK-NEXT: [[COS:%.*]] = call float @llvm.cos.f32(float [[X:%.*]]) 96; CHECK-NEXT: ret float [[COS]] 97; 98 %x.fabs = call float @llvm.fabs.f32(float %x) 99 %cos = call float @llvm.cos.f32(float %x.fabs) 100 ret float %cos 101} 102 103define float @fabs_fneg_f32(float %x) { 104; CHECK-LABEL: @fabs_fneg_f32( 105; CHECK-NEXT: [[COS:%.*]] = call float @llvm.cos.f32(float [[X:%.*]]) 106; CHECK-NEXT: ret float [[COS]] 107; 108 %x.fabs = call float @llvm.fabs.f32(float %x) 109 %x.fabs.fneg = fsub float -0.0, %x.fabs 110 %cos = call float @llvm.cos.f32(float %x.fabs.fneg) 111 ret float %cos 112} 113 114define float @fabs_unary_fneg_f32(float %x) { 115; CHECK-LABEL: @fabs_unary_fneg_f32( 116; CHECK-NEXT: [[COS:%.*]] = call float @llvm.cos.f32(float [[X:%.*]]) 117; CHECK-NEXT: ret float [[COS]] 118; 119 %x.fabs = call float @llvm.fabs.f32(float %x) 120 %x.fabs.fneg = fneg float %x.fabs 121 %cos = call float @llvm.cos.f32(float %x.fabs.fneg) 122 ret float %cos 123} 124 125define <2 x float> @fabs_fneg_v2f32(<2 x float> %x) { 126; CHECK-LABEL: @fabs_fneg_v2f32( 127; CHECK-NEXT: [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 128; CHECK-NEXT: ret <2 x float> [[COS]] 129; 130 %x.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %x) 131 %x.fabs.fneg = fsub <2 x float> <float -0.0, float -0.0>, %x.fabs 132 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fabs.fneg) 133 ret <2 x float> %cos 134} 135 136define <2 x float> @fabs_unary_fneg_v2f32(<2 x float> %x) { 137; CHECK-LABEL: @fabs_unary_fneg_v2f32( 138; CHECK-NEXT: [[COS:%.*]] = call <2 x float> @llvm.cos.v2f32(<2 x float> [[X:%.*]]) 139; CHECK-NEXT: ret <2 x float> [[COS]] 140; 141 %x.fabs = call <2 x float> @llvm.fabs.v2f32(<2 x float> %x) 142 %x.fabs.fneg = fneg <2 x float> %x.fabs 143 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fabs.fneg) 144 ret <2 x float> %cos 145} 146 147; Negate is canonicalized after sin. 148 149declare <2 x float> @llvm.sin.v2f32(<2 x float>) 150 151define <2 x float> @fneg_sin(<2 x float> %x){ 152; CHECK-LABEL: @fneg_sin( 153; CHECK-NEXT: [[TMP1:%.*]] = call <2 x float> @llvm.sin.v2f32(<2 x float> [[X:%.*]]) 154; CHECK-NEXT: [[R:%.*]] = fneg <2 x float> [[TMP1]] 155; CHECK-NEXT: ret <2 x float> [[R]] 156; 157 %negx = fsub <2 x float> <float -0.0, float -0.0>, %x 158 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %negx) 159 ret <2 x float> %r 160} 161 162define <2 x float> @unary_fneg_sin(<2 x float> %x){ 163; CHECK-LABEL: @unary_fneg_sin( 164; CHECK-NEXT: [[TMP1:%.*]] = call <2 x float> @llvm.sin.v2f32(<2 x float> [[X:%.*]]) 165; CHECK-NEXT: [[R:%.*]] = fneg <2 x float> [[TMP1]] 166; CHECK-NEXT: ret <2 x float> [[R]] 167; 168 %negx = fneg <2 x float> %x 169 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %negx) 170 ret <2 x float> %r 171} 172 173; FMF are not required, but they should propagate. 174 175define <2 x float> @fneg_sin_fmf(<2 x float> %x){ 176; CHECK-LABEL: @fneg_sin_fmf( 177; CHECK-NEXT: [[TMP1:%.*]] = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> [[X:%.*]]) 178; CHECK-NEXT: [[R:%.*]] = fneg nnan arcp afn <2 x float> [[TMP1]] 179; CHECK-NEXT: ret <2 x float> [[R]] 180; 181 %negx = fsub fast <2 x float> <float -0.0, float -0.0>, %x 182 %r = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> %negx) 183 ret <2 x float> %r 184} 185 186define <2 x float> @unary_fneg_sin_fmf(<2 x float> %x){ 187; CHECK-LABEL: @unary_fneg_sin_fmf( 188; CHECK-NEXT: [[TMP1:%.*]] = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> [[X:%.*]]) 189; CHECK-NEXT: [[R:%.*]] = fneg nnan arcp afn <2 x float> [[TMP1]] 190; CHECK-NEXT: ret <2 x float> [[R]] 191; 192 %negx = fneg fast <2 x float> %x 193 %r = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> %negx) 194 ret <2 x float> %r 195} 196