1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define double @std_cabs(double %real, double %imag) { 5; CHECK-LABEL: @std_cabs( 6; CHECK-NEXT: [[CALL:%.*]] = tail call double @cabs(double [[REAL:%.*]], double [[IMAG:%.*]]) 7; CHECK-NEXT: ret double [[CALL]] 8; 9 %call = tail call double @cabs(double %real, double %imag) 10 ret double %call 11} 12 13define float @std_cabsf(float %real, float %imag) { 14; CHECK-LABEL: @std_cabsf( 15; CHECK-NEXT: [[CALL:%.*]] = tail call float @cabsf(float [[REAL:%.*]], float [[IMAG:%.*]]) 16; CHECK-NEXT: ret float [[CALL]] 17; 18 %call = tail call float @cabsf(float %real, float %imag) 19 ret float %call 20} 21 22define fp128 @std_cabsl(fp128 %real, fp128 %imag) { 23; CHECK-LABEL: @std_cabsl( 24; CHECK-NEXT: [[CALL:%.*]] = tail call fp128 @cabsl(fp128 [[REAL:%.*]], fp128 [[IMAG:%.*]]) 25; CHECK-NEXT: ret fp128 [[CALL]] 26; 27 %call = tail call fp128 @cabsl(fp128 %real, fp128 %imag) 28 ret fp128 %call 29} 30 31define double @fast_cabs(double %real, double %imag) { 32; CHECK-LABEL: @fast_cabs( 33; CHECK-NEXT: [[TMP1:%.*]] = fmul fast double [[REAL:%.*]], [[REAL]] 34; CHECK-NEXT: [[TMP2:%.*]] = fmul fast double [[IMAG:%.*]], [[IMAG]] 35; CHECK-NEXT: [[TMP3:%.*]] = fadd fast double [[TMP1]], [[TMP2]] 36; CHECK-NEXT: [[CABS:%.*]] = tail call fast double @llvm.sqrt.f64(double [[TMP3]]) 37; CHECK-NEXT: ret double [[CABS]] 38; 39 %call = tail call fast double @cabs(double %real, double %imag) 40 ret double %call 41} 42 43define double @cabs_zero_real(double %imag) { 44; CHECK-LABEL: @cabs_zero_real( 45; CHECK-NEXT: [[CABS:%.*]] = tail call double @llvm.fabs.f64(double [[IMAG:%.*]]) 46; CHECK-NEXT: ret double [[CABS]] 47; 48 %call = tail call double @cabs(double 0.0, double %imag) 49 ret double %call 50} 51 52define double @fast_cabs_neg_zero_real(double %imag) { 53; CHECK-LABEL: @fast_cabs_neg_zero_real( 54; CHECK-NEXT: [[CABS:%.*]] = tail call fast double @llvm.fabs.f64(double [[IMAG:%.*]]) 55; CHECK-NEXT: ret double [[CABS]] 56; 57 %call = tail call fast double @cabs(double -0.0, double %imag) 58 ret double %call 59} 60 61define double @cabs_zero_imag(double %real) { 62; CHECK-LABEL: @cabs_zero_imag( 63; CHECK-NEXT: [[CABS:%.*]] = tail call double @llvm.fabs.f64(double [[REAL:%.*]]) 64; CHECK-NEXT: ret double [[CABS]] 65; 66 %call = tail call double @cabs(double %real, double 0.0) 67 ret double %call 68} 69 70define float @fast_cabsf(float %real, float %imag) { 71; CHECK-LABEL: @fast_cabsf( 72; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[REAL:%.*]], [[REAL]] 73; CHECK-NEXT: [[TMP2:%.*]] = fmul fast float [[IMAG:%.*]], [[IMAG]] 74; CHECK-NEXT: [[TMP3:%.*]] = fadd fast float [[TMP1]], [[TMP2]] 75; CHECK-NEXT: [[CABS:%.*]] = tail call fast float @llvm.sqrt.f32(float [[TMP3]]) 76; CHECK-NEXT: ret float [[CABS]] 77; 78 %call = tail call fast float @cabsf(float %real, float %imag) 79 ret float %call 80} 81 82define float @cabsf_zero_real(float %imag) { 83; CHECK-LABEL: @cabsf_zero_real( 84; CHECK-NEXT: [[CABS:%.*]] = tail call float @llvm.fabs.f32(float [[IMAG:%.*]]) 85; CHECK-NEXT: ret float [[CABS]] 86; 87 %call = tail call float @cabsf(float 0.0, float %imag) 88 ret float %call 89} 90 91define float @fast_cabsf_neg_zero_real(float %imag) { 92; CHECK-LABEL: @fast_cabsf_neg_zero_real( 93; CHECK-NEXT: [[CABS:%.*]] = tail call fast float @llvm.fabs.f32(float [[IMAG:%.*]]) 94; CHECK-NEXT: ret float [[CABS]] 95; 96 %call = tail call fast float @cabsf(float -0.0, float %imag) 97 ret float %call 98} 99 100define float @cabsf_zero_imag(float %real) { 101; CHECK-LABEL: @cabsf_zero_imag( 102; CHECK-NEXT: [[CABS:%.*]] = tail call float @llvm.fabs.f32(float [[REAL:%.*]]) 103; CHECK-NEXT: ret float [[CABS]] 104; 105 %call = tail call float @cabsf(float %real, float 0.0) 106 ret float %call 107} 108 109define fp128 @fast_cabsl(fp128 %real, fp128 %imag) { 110; CHECK-LABEL: @fast_cabsl( 111; CHECK-NEXT: [[TMP1:%.*]] = fmul fast fp128 [[REAL:%.*]], [[REAL]] 112; CHECK-NEXT: [[TMP2:%.*]] = fmul fast fp128 [[IMAG:%.*]], [[IMAG]] 113; CHECK-NEXT: [[TMP3:%.*]] = fadd fast fp128 [[TMP1]], [[TMP2]] 114; CHECK-NEXT: [[CABS:%.*]] = tail call fast fp128 @llvm.sqrt.f128(fp128 [[TMP3]]) 115; CHECK-NEXT: ret fp128 [[CABS]] 116; 117 %call = tail call fast fp128 @cabsl(fp128 %real, fp128 %imag) 118 ret fp128 %call 119} 120 121define fp128 @cabsl_zero_real(fp128 %imag) { 122; CHECK-LABEL: @cabsl_zero_real( 123; CHECK-NEXT: [[CABS:%.*]] = tail call fp128 @llvm.fabs.f128(fp128 [[IMAG:%.*]]) 124; CHECK-NEXT: ret fp128 [[CABS]] 125; 126 %call = tail call fp128 @cabsl(fp128 0xL00000000000000000000000000000000, fp128 %imag) 127 ret fp128 %call 128} 129 130define fp128 @cabsl_zero_imag(fp128 %real) { 131; CHECK-LABEL: @cabsl_zero_imag( 132; CHECK-NEXT: [[CABS:%.*]] = tail call fp128 @llvm.fabs.f128(fp128 [[REAL:%.*]]) 133; CHECK-NEXT: ret fp128 [[CABS]] 134; 135 %call = tail call fp128 @cabsl(fp128 %real, fp128 0xL00000000000000000000000000000000) 136 ret fp128 %call 137} 138 139define fp128 @fast_cabsl_neg_zero_imag(fp128 %real) { 140; CHECK-LABEL: @fast_cabsl_neg_zero_imag( 141; CHECK-NEXT: [[CABS:%.*]] = tail call fast fp128 @llvm.fabs.f128(fp128 [[REAL:%.*]]) 142; CHECK-NEXT: ret fp128 [[CABS]] 143; 144 %call = tail call fast fp128 @cabsl(fp128 %real, fp128 0xL00000000000000008000000000000000) 145 ret fp128 %call 146} 147 148declare double @cabs(double %real, double %imag) 149declare float @cabsf(float %real, float %imag) 150declare fp128 @cabsl(fp128 %real, fp128 %imag) 151