197 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4; https://bugs.llvm.org/show_bug.cgi?id=416685 6define double @constant_fold_fdiv_by_zero(ptr %p) {7; CHECK-LABEL: constant_fold_fdiv_by_zero:8; CHECK: // %bb.0:9; CHECK-NEXT: mov x8, #921886843722740531210; CHECK-NEXT: fmov d0, x811; CHECK-NEXT: ret12 %r = fdiv double 4.940660e-324, 0.013 ret double %r14}15 16; frem by 0.0 --> NaN17 18define double @constant_fold_frem_by_zero(ptr %p) {19; CHECK-LABEL: constant_fold_frem_by_zero:20; CHECK: // %bb.0:21; CHECK-NEXT: mov x8, #922112023704109056022; CHECK-NEXT: fmov d0, x823; CHECK-NEXT: ret24 %r = frem double 4.940660e-324, 0.025 ret double %r26}27 28; Inf * 0.0 --> NaN29 30define double @constant_fold_fmul_nan(ptr %p) {31; CHECK-LABEL: constant_fold_fmul_nan:32; CHECK: // %bb.0:33; CHECK-NEXT: mov x8, #922112023704109056034; CHECK-NEXT: fmov d0, x835; CHECK-NEXT: ret36 %r = fmul double 0x7ff0000000000000, 0.037 ret double %r38}39 40; Inf + -Inf --> NaN41 42define double @constant_fold_fadd_nan(ptr %p) {43; CHECK-LABEL: constant_fold_fadd_nan:44; CHECK: // %bb.0:45; CHECK-NEXT: mov x8, #922112023704109056046; CHECK-NEXT: fmov d0, x847; CHECK-NEXT: ret48 %r = fadd double 0x7ff0000000000000, 0xfff000000000000049 ret double %r50}51 52; Inf - Inf --> NaN53 54define double @constant_fold_fsub_nan(ptr %p) {55; CHECK-LABEL: constant_fold_fsub_nan:56; CHECK: // %bb.0:57; CHECK-NEXT: mov x8, #922112023704109056058; CHECK-NEXT: fmov d0, x859; CHECK-NEXT: ret60 %r = fsub double 0x7ff0000000000000, 0x7ff000000000000061 ret double %r62}63 64; Inf * 0.0 + ? --> NaN65 66define double @constant_fold_fma_nan(ptr %p) {67; CHECK-LABEL: constant_fold_fma_nan:68; CHECK: // %bb.0:69; CHECK-NEXT: mov x8, #922112023704109056070; CHECK-NEXT: fmov d0, x871; CHECK-NEXT: ret72 %r = call double @llvm.fma.f64(double 0x7ff0000000000000, double 0.0, double 42.0)73 ret double %r74}75 76define double @fdiv_nnan_nan_op0(double %x) {77; CHECK-LABEL: fdiv_nnan_nan_op0:78; CHECK: // %bb.0:79; CHECK-NEXT: ret80 %r = fdiv nnan double 0xfff8000000000000, %x81 ret double %r82}83 84define double @fmul_nnan_nan_op1(double %x) {85; CHECK-LABEL: fmul_nnan_nan_op1:86; CHECK: // %bb.0:87; CHECK-NEXT: ret88 %r = fmul nnan double %x, 0x7ff800000000000089 ret double %r90}91 92; Negative test - nan is ok.93; TODO: Should simplify to nan.94 95define double @fdiv_ninf_nan_op0(double %x) {96; CHECK-LABEL: fdiv_ninf_nan_op0:97; CHECK: // %bb.0:98; CHECK-NEXT: mov x8, #-225179981368524899; CHECK-NEXT: fmov d1, x8100; CHECK-NEXT: fdiv d0, d1, d0101; CHECK-NEXT: ret102 %r = fdiv ninf double 0xfff8000000000000, %x103 ret double %r104}105 106; Negative test - nan is ok.107; TODO: Should simplify to nan.108 109define double @fadd_ninf_nan_op1(double %x) {110; CHECK-LABEL: fadd_ninf_nan_op1:111; CHECK: // %bb.0:112; CHECK-NEXT: mov x8, #9221120237041090560113; CHECK-NEXT: fmov d1, x8114; CHECK-NEXT: fadd d0, d0, d1115; CHECK-NEXT: ret116 %r = fadd ninf double %x, 0x7ff8000000000000117 ret double %r118}119 120define double @fdiv_ninf_inf_op0(double %x) {121; CHECK-LABEL: fdiv_ninf_inf_op0:122; CHECK: // %bb.0:123; CHECK-NEXT: ret124 %r = fdiv ninf double 0x7ff0000000000000, %x125 ret double %r126}127 128define double @fadd_ninf_inf_op1(double %x) {129; CHECK-LABEL: fadd_ninf_inf_op1:130; CHECK: // %bb.0:131; CHECK-NEXT: ret132 %r = fadd ninf double %x, 0xfff0000000000000133 ret double %r134}135 136; Negative test - inf is ok.137; TODO: Should simplify to inf.138 139define double @fsub_nnan_inf_op0(double %x) {140; CHECK-LABEL: fsub_nnan_inf_op0:141; CHECK: // %bb.0:142; CHECK-NEXT: mov x8, #9218868437227405312143; CHECK-NEXT: fmov d1, x8144; CHECK-NEXT: fsub d0, d1, d0145; CHECK-NEXT: ret146 %r = fsub nnan double 0x7ff0000000000000, %x147 ret double %r148}149 150; Negative test - inf is ok.151; TODO: Should simplify to -inf.152 153define double @fmul_nnan_inf_op1(double %x) {154; CHECK-LABEL: fmul_nnan_inf_op1:155; CHECK: // %bb.0:156; CHECK-NEXT: mov x8, #-4503599627370496157; CHECK-NEXT: fmov d1, x8158; CHECK-NEXT: fmul d0, d0, d1159; CHECK-NEXT: ret160 %r = fmul nnan double %x, 0xfff0000000000000161 ret double %r162}163 164define double @fdiv_nnan_undef_op0(double %x) {165; CHECK-LABEL: fdiv_nnan_undef_op0:166; CHECK: // %bb.0:167; CHECK-NEXT: ret168 %r = fdiv nnan double undef, %x169 ret double %r170}171 172define double @fdiv_nnan_undef_op1(double %x) {173; CHECK-LABEL: fdiv_nnan_undef_op1:174; CHECK: // %bb.0:175; CHECK-NEXT: ret176 %r = fdiv nnan double %x, undef177 ret double %r178}179 180define double @fdiv_ninf_undef_op0(double %x) {181; CHECK-LABEL: fdiv_ninf_undef_op0:182; CHECK: // %bb.0:183; CHECK-NEXT: ret184 %r = fdiv ninf double undef, %x185 ret double %r186}187 188define double @fdiv_ninf_undef_op1(double %x) {189; CHECK-LABEL: fdiv_ninf_undef_op1:190; CHECK: // %bb.0:191; CHECK-NEXT: ret192 %r = fdiv ninf double %x, undef193 ret double %r194}195 196declare double @llvm.fma.f64(double, double, double)197