1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4define float @fadd_undef_op0(float %x) { 5; CHECK-LABEL: @fadd_undef_op0( 6; CHECK-NEXT: ret float 0x7FF8000000000000 7; 8 %r = fadd float undef, %x 9 ret float %r 10} 11 12define float @fadd_poison_op0(float %x) { 13; CHECK-LABEL: @fadd_poison_op0( 14; CHECK-NEXT: ret float poison 15; 16 %r = fadd float poison, %x 17 ret float %r 18} 19 20define float @fadd_undef_op1(float %x) { 21; CHECK-LABEL: @fadd_undef_op1( 22; CHECK-NEXT: ret float 0x7FF8000000000000 23; 24 %r = fadd float %x, undef 25 ret float %r 26} 27 28define float @fadd_poison_op1(float %x) { 29; CHECK-LABEL: @fadd_poison_op1( 30; CHECK-NEXT: ret float poison 31; 32 %r = fadd float %x, poison 33 ret float %r 34} 35 36define float @fsub_undef_op0(float %x) { 37; CHECK-LABEL: @fsub_undef_op0( 38; CHECK-NEXT: ret float 0x7FF8000000000000 39; 40 %r = fsub float undef, %x 41 ret float %r 42} 43 44define float @fsub_poison_op0(float %x) { 45; CHECK-LABEL: @fsub_poison_op0( 46; CHECK-NEXT: ret float poison 47; 48 %r = fsub float poison, %x 49 ret float %r 50} 51 52define float @fsub_undef_op1(float %x) { 53; CHECK-LABEL: @fsub_undef_op1( 54; CHECK-NEXT: ret float 0x7FF8000000000000 55; 56 %r = fsub float %x, undef 57 ret float %r 58} 59 60define float @fsub_poison_op1(float %x) { 61; CHECK-LABEL: @fsub_poison_op1( 62; CHECK-NEXT: ret float poison 63; 64 %r = fsub float %x, poison 65 ret float %r 66} 67 68define float @fmul_undef_op0(float %x) { 69; CHECK-LABEL: @fmul_undef_op0( 70; CHECK-NEXT: ret float 0x7FF8000000000000 71; 72 %r = fmul float undef, %x 73 ret float %r 74} 75 76define float @fmul_poison_op0(float %x) { 77; CHECK-LABEL: @fmul_poison_op0( 78; CHECK-NEXT: ret float poison 79; 80 %r = fmul float poison, %x 81 ret float %r 82} 83 84define float @fmul_undef_op1(float %x) { 85; CHECK-LABEL: @fmul_undef_op1( 86; CHECK-NEXT: ret float 0x7FF8000000000000 87; 88 %r = fmul float %x, undef 89 ret float %r 90} 91 92define float @fmul_poison_op1(float %x) { 93; CHECK-LABEL: @fmul_poison_op1( 94; CHECK-NEXT: ret float poison 95; 96 %r = fmul float %x, poison 97 ret float %r 98} 99 100define float @fdiv_undef_op0(float %x) { 101; CHECK-LABEL: @fdiv_undef_op0( 102; CHECK-NEXT: ret float 0x7FF8000000000000 103; 104 %r = fdiv float undef, %x 105 ret float %r 106} 107 108define float @fdiv_poison_op0(float %x) { 109; CHECK-LABEL: @fdiv_poison_op0( 110; CHECK-NEXT: ret float poison 111; 112 %r = fdiv float poison, %x 113 ret float %r 114} 115 116define float @fdiv_undef_op1(float %x) { 117; CHECK-LABEL: @fdiv_undef_op1( 118; CHECK-NEXT: ret float 0x7FF8000000000000 119; 120 %r = fdiv float %x, undef 121 ret float %r 122} 123 124define float @fdiv_poison_op1(float %x) { 125; CHECK-LABEL: @fdiv_poison_op1( 126; CHECK-NEXT: ret float poison 127; 128 %r = fdiv float %x, poison 129 ret float %r 130} 131 132define float @frem_undef_op0(float %x) { 133; CHECK-LABEL: @frem_undef_op0( 134; CHECK-NEXT: ret float 0x7FF8000000000000 135; 136 %r = frem float undef, %x 137 ret float %r 138} 139 140define float @frem_poison_op0(float %x) { 141; CHECK-LABEL: @frem_poison_op0( 142; CHECK-NEXT: ret float poison 143; 144 %r = frem float poison, %x 145 ret float %r 146} 147 148define float @frem_undef_op1(float %x) { 149; CHECK-LABEL: @frem_undef_op1( 150; CHECK-NEXT: ret float 0x7FF8000000000000 151; 152 %r = frem float %x, undef 153 ret float %r 154} 155 156define float @frem_poison_op1(float %x) { 157; CHECK-LABEL: @frem_poison_op1( 158; CHECK-NEXT: ret float poison 159; 160 %r = frem float %x, poison 161 ret float %r 162} 163 164; Repeat all tests with fast-math-flags. Alternate 'nnan' and 'fast' for more coverage. 165 166define float @fadd_undef_op0_nnan(float %x) { 167; CHECK-LABEL: @fadd_undef_op0_nnan( 168; CHECK-NEXT: ret float poison 169; 170 %r = fadd nnan float undef, %x 171 ret float %r 172} 173 174define float @fadd_undef_op1_fast(float %x) { 175; CHECK-LABEL: @fadd_undef_op1_fast( 176; CHECK-NEXT: ret float poison 177; 178 %r = fadd fast float %x, undef 179 ret float %r 180} 181 182define float @fsub_undef_op0_fast(float %x) { 183; CHECK-LABEL: @fsub_undef_op0_fast( 184; CHECK-NEXT: ret float poison 185; 186 %r = fsub fast float undef, %x 187 ret float %r 188} 189 190define float @fsub_undef_op1_nnan(float %x) { 191; CHECK-LABEL: @fsub_undef_op1_nnan( 192; CHECK-NEXT: ret float poison 193; 194 %r = fsub nnan float %x, undef 195 ret float %r 196} 197 198define float @fmul_undef_op0_nnan(float %x) { 199; CHECK-LABEL: @fmul_undef_op0_nnan( 200; CHECK-NEXT: ret float poison 201; 202 %r = fmul nnan float undef, %x 203 ret float %r 204} 205 206define float @fmul_undef_op1_fast(float %x) { 207; CHECK-LABEL: @fmul_undef_op1_fast( 208; CHECK-NEXT: ret float poison 209; 210 %r = fmul fast float %x, undef 211 ret float %r 212} 213 214define float @fdiv_undef_op0_fast(float %x) { 215; CHECK-LABEL: @fdiv_undef_op0_fast( 216; CHECK-NEXT: ret float poison 217; 218 %r = fdiv fast float undef, %x 219 ret float %r 220} 221 222define float @fdiv_undef_op1_nnan(float %x) { 223; CHECK-LABEL: @fdiv_undef_op1_nnan( 224; CHECK-NEXT: ret float poison 225; 226 %r = fdiv nnan float %x, undef 227 ret float %r 228} 229 230define float @frem_undef_op0_nnan(float %x) { 231; CHECK-LABEL: @frem_undef_op0_nnan( 232; CHECK-NEXT: ret float poison 233; 234 %r = frem nnan float undef, %x 235 ret float %r 236} 237 238define float @frem_undef_op1_fast(float %x) { 239; CHECK-LABEL: @frem_undef_op1_fast( 240; CHECK-NEXT: ret float poison 241; 242 %r = frem fast float %x, undef 243 ret float %r 244} 245 246define double @fdiv_ninf_nan_op0(double %x) { 247; CHECK-LABEL: @fdiv_ninf_nan_op0( 248; CHECK-NEXT: ret double 0xFFF8000000000000 249; 250 %r = fdiv ninf double 0xfff8000000000000, %x 251 ret double %r 252} 253 254define double @fadd_ninf_nan_op1(double %x) { 255; CHECK-LABEL: @fadd_ninf_nan_op1( 256; CHECK-NEXT: ret double 0x7FF8000000000000 257; 258 %r = fadd ninf double %x, 0x7ff8000000000000 259 ret double %r 260} 261 262define double @fdiv_ninf_inf_op0(double %x) { 263; CHECK-LABEL: @fdiv_ninf_inf_op0( 264; CHECK-NEXT: ret double poison 265; 266 %r = fdiv ninf double 0x7ff0000000000000, %x 267 ret double %r 268} 269 270define double @fadd_ninf_inf_op1(double %x) { 271; CHECK-LABEL: @fadd_ninf_inf_op1( 272; CHECK-NEXT: ret double poison 273; 274 %r = fadd ninf double %x, 0xfff0000000000000 275 ret double %r 276} 277 278define double @fsub_nnan_inf_op0(double %x) { 279; CHECK-LABEL: @fsub_nnan_inf_op0( 280; CHECK-NEXT: ret double 0x7FF0000000000000 281; 282 %r = fsub nnan double 0x7ff0000000000000, %x 283 ret double %r 284} 285 286; This can't simplify - the result is infinity, but the sign is unknown. 287 288define double @fmul_nnan_inf_op1(double %x) { 289; CHECK-LABEL: @fmul_nnan_inf_op1( 290; CHECK-NEXT: [[R:%.*]] = fmul nnan double [[X:%.*]], 0xFFF0000000000000 291; CHECK-NEXT: ret double [[R]] 292; 293 %r = fmul nnan double %x, 0xfff0000000000000 294 ret double %r 295} 296