1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=ANY,STRICT 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s --check-prefixes=ANY,UNSAFE 4 5 define float @fadd_zero(float %x) { 6 ; STRICT-LABEL: fadd_zero: 7 ; STRICT: # %bb.0: 8 ; STRICT-NEXT: xorps %xmm1, %xmm1 9 ; STRICT-NEXT: addss %xmm1, %xmm0 10 ; STRICT-NEXT: retq 11 ; 12 ; UNSAFE-LABEL: fadd_zero: 13 ; UNSAFE: # %bb.0: 14 ; UNSAFE-NEXT: retq 15 %r = fadd float %x, 0.0 16 ret float %r 17 } 18 19 define float @fadd_negzero(float %x) { 20 ; ANY-LABEL: fadd_negzero: 21 ; ANY: # %bb.0: 22 ; ANY-NEXT: retq 23 %r = fadd float %x, -0.0 24 ret float %r 25 } 26 27 define float @fadd_produce_zero(float %x) { 28 ; ANY-LABEL: fadd_produce_zero: 29 ; ANY: # %bb.0: 30 ; ANY-NEXT: xorps %xmm0, %xmm0 31 ; ANY-NEXT: retq 32 %neg = fsub nsz float 0.0, %x 33 %r = fadd nnan float %neg, %x 34 ret float %r 35 } 36 37 define float @fadd_reassociate(float %x) { 38 ; ANY-LABEL: fadd_reassociate: 39 ; ANY: # %bb.0: 40 ; ANY-NEXT: addss {{.*}}(%rip), %xmm0 41 ; ANY-NEXT: retq 42 %sum = fadd float %x, 8.0 43 %r = fadd reassoc nsz float %sum, 12.0 44 ret float %r 45 } 46 47 define float @fadd_negzero_nsz(float %x) { 48 ; ANY-LABEL: fadd_negzero_nsz: 49 ; ANY: # %bb.0: 50 ; ANY-NEXT: retq 51 %r = fadd nsz float %x, -0.0 52 ret float %r 53 } 54 55 define float @fadd_zero_nsz(float %x) { 56 ; ANY-LABEL: fadd_zero_nsz: 57 ; ANY: # %bb.0: 58 ; ANY-NEXT: retq 59 %r = fadd nsz float %x, 0.0 60 ret float %r 61 } 62 63 define float @fsub_zero(float %x) { 64 ; ANY-LABEL: fsub_zero: 65 ; ANY: # %bb.0: 66 ; ANY-NEXT: retq 67 %r = fsub float %x, 0.0 68 ret float %r 69 } 70 71 define float @fsub_self(float %x) { 72 ; ANY-LABEL: fsub_self: 73 ; ANY: # %bb.0: 74 ; ANY-NEXT: xorps %xmm0, %xmm0 75 ; ANY-NEXT: retq 76 %r = fsub nnan float %x, %x 77 ret float %r 78 } 79 80 define float @fsub_neg_x_y(float %x, float %y) { 81 ; ANY-LABEL: fsub_neg_x_y: 82 ; ANY: # %bb.0: 83 ; ANY-NEXT: subss %xmm0, %xmm1 84 ; ANY-NEXT: movaps %xmm1, %xmm0 85 ; ANY-NEXT: retq 86 %neg = fsub nsz float 0.0, %x 87 %r = fadd nsz float %neg, %y 88 ret float %r 89 } 90 91 define float @fsub_negzero(float %x) { 92 ; STRICT-LABEL: fsub_negzero: 93 ; STRICT: # %bb.0: 94 ; STRICT-NEXT: xorps %xmm1, %xmm1 95 ; STRICT-NEXT: addss %xmm1, %xmm0 96 ; STRICT-NEXT: retq 97 ; 98 ; UNSAFE-LABEL: fsub_negzero: 99 ; UNSAFE: # %bb.0: 100 ; UNSAFE-NEXT: retq 101 %r = fsub float %x, -0.0 102 ret float %r 103 } 104 105 define float @fsub_zero_nsz_1(float %x) { 106 ; ANY-LABEL: fsub_zero_nsz_1: 107 ; ANY: # %bb.0: 108 ; ANY-NEXT: retq 109 %r = fsub nsz float %x, 0.0 110 ret float %r 111 } 112 113 define float @fsub_zero_nsz_2(float %x) { 114 ; ANY-LABEL: fsub_zero_nsz_2: 115 ; ANY: # %bb.0: 116 ; ANY-NEXT: xorps {{.*}}(%rip), %xmm0 117 ; ANY-NEXT: retq 118 %r = fsub nsz float 0.0, %x 119 ret float %r 120 } 121 122 define float @fsub_negzero_nsz(float %x) { 123 ; ANY-LABEL: fsub_negzero_nsz: 124 ; ANY: # %bb.0: 125 ; ANY-NEXT: retq 126 %r = fsub nsz float %x, -0.0 127 ret float %r 128 } 129 130 define float @fmul_zero(float %x) { 131 ; ANY-LABEL: fmul_zero: 132 ; ANY: # %bb.0: 133 ; ANY-NEXT: xorps %xmm0, %xmm0 134 ; ANY-NEXT: retq 135 %r = fmul nnan nsz float %x, 0.0 136 ret float %r 137 } 138 139 define float @fmul_one(float %x) { 140 ; ANY-LABEL: fmul_one: 141 ; ANY: # %bb.0: 142 ; ANY-NEXT: retq 143 %r = fmul float %x, 1.0 144 ret float %r 145 } 146 147 define float @fmul_x_const_const(float %x) { 148 ; ANY-LABEL: fmul_x_const_const: 149 ; ANY: # %bb.0: 150 ; ANY-NEXT: mulss {{.*}}(%rip), %xmm0 151 ; ANY-NEXT: retq 152 %mul = fmul reassoc float %x, 9.0 153 %r = fmul reassoc float %mul, 4.0 154 ret float %r 155 } 156