brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · d96d225 Raw
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