196 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 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+0014;15 %r = call double @llvm.cos.f64(double undef)16 ret double %r17}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+0023; 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, %cosval28 ret float %fsum29}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, %x37 %cos = call float @llvm.cos.f32(float %x.fneg)38 ret float %cos39}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 %x47 %cos = call float @llvm.cos.f32(float %x.fneg)48 ret float %cos49}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>, %x57 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fneg)58 ret <2 x float> %cos59}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> %x67 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fneg)68 ret <2 x float> %cos69}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>, %x79 %r = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> %negx)80 ret <2 x float> %r81}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> %x89 %r = call nnan afn <2 x float> @llvm.cos.v2f32(<2 x float> %negx)90 ret <2 x float> %r91}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 %cos101}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.fabs110 %cos = call float @llvm.cos.f32(float %x.fabs.fneg)111 ret float %cos112}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.fabs121 %cos = call float @llvm.cos.f32(float %x.fabs.fneg)122 ret float %cos123}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.fabs132 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fabs.fneg)133 ret <2 x float> %cos134}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.fabs143 %cos = call <2 x float> @llvm.cos.v2f32(<2 x float> %x.fabs.fneg)144 ret <2 x float> %cos145}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>, %x158 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %negx)159 ret <2 x float> %r160}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> %x169 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %negx)170 ret <2 x float> %r171}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>, %x182 %r = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> %negx)183 ret <2 x float> %r184}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> %x193 %r = call nnan arcp afn <2 x float> @llvm.sin.v2f32(<2 x float> %negx)194 ret <2 x float> %r195}196