@@ -257,6 +257,7 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
257
257
auto loc = op.getLoc ();
258
258
auto type = cast<ComplexType>(adaptor.getLhs ().getType ());
259
259
auto elementType = cast<FloatType>(type.getElementType ());
260
+ arith::FastMathFlagsAttr fmf = op.getFastMathFlagsAttr ();
260
261
261
262
Value lhsReal =
262
263
rewriter.create <complex::ReOp>(loc, elementType, adaptor.getLhs ());
@@ -290,45 +291,51 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
290
291
//
291
292
// See https://dl.acm.org/citation.cfm?id=368661 for more details.
292
293
Value rhsRealImagRatio =
293
- rewriter.create <arith::DivFOp>(loc, rhsReal, rhsImag);
294
+ rewriter.create <arith::DivFOp>(loc, rhsReal, rhsImag, fmf );
294
295
Value rhsRealImagDenom = rewriter.create <arith::AddFOp>(
295
296
loc, rhsImag,
296
- rewriter.create <arith::MulFOp>(loc, rhsRealImagRatio, rhsReal));
297
+ rewriter.create <arith::MulFOp>(loc, rhsRealImagRatio, rhsReal, fmf),
298
+ fmf);
297
299
Value realNumerator1 = rewriter.create <arith::AddFOp>(
298
- loc, rewriter.create <arith::MulFOp>(loc, lhsReal, rhsRealImagRatio),
299
- lhsImag);
300
- Value resultReal1 =
301
- rewriter.create <arith::DivFOp>(loc, realNumerator1, rhsRealImagDenom);
300
+ loc,
301
+ rewriter.create <arith::MulFOp>(loc, lhsReal, rhsRealImagRatio, fmf),
302
+ lhsImag, fmf);
303
+ Value resultReal1 = rewriter.create <arith::DivFOp>(loc, realNumerator1,
304
+ rhsRealImagDenom, fmf);
302
305
Value imagNumerator1 = rewriter.create <arith::SubFOp>(
303
- loc, rewriter.create <arith::MulFOp>(loc, lhsImag, rhsRealImagRatio),
304
- lhsReal);
305
- Value resultImag1 =
306
- rewriter.create <arith::DivFOp>(loc, imagNumerator1, rhsRealImagDenom);
306
+ loc,
307
+ rewriter.create <arith::MulFOp>(loc, lhsImag, rhsRealImagRatio, fmf),
308
+ lhsReal, fmf);
309
+ Value resultImag1 = rewriter.create <arith::DivFOp>(loc, imagNumerator1,
310
+ rhsRealImagDenom, fmf);
307
311
308
312
Value rhsImagRealRatio =
309
- rewriter.create <arith::DivFOp>(loc, rhsImag, rhsReal);
313
+ rewriter.create <arith::DivFOp>(loc, rhsImag, rhsReal, fmf );
310
314
Value rhsImagRealDenom = rewriter.create <arith::AddFOp>(
311
315
loc, rhsReal,
312
- rewriter.create <arith::MulFOp>(loc, rhsImagRealRatio, rhsImag));
316
+ rewriter.create <arith::MulFOp>(loc, rhsImagRealRatio, rhsImag, fmf),
317
+ fmf);
313
318
Value realNumerator2 = rewriter.create <arith::AddFOp>(
314
319
loc, lhsReal,
315
- rewriter.create <arith::MulFOp>(loc, lhsImag, rhsImagRealRatio));
316
- Value resultReal2 =
317
- rewriter.create <arith::DivFOp>(loc, realNumerator2, rhsImagRealDenom);
320
+ rewriter.create <arith::MulFOp>(loc, lhsImag, rhsImagRealRatio, fmf),
321
+ fmf);
322
+ Value resultReal2 = rewriter.create <arith::DivFOp>(loc, realNumerator2,
323
+ rhsImagRealDenom, fmf);
318
324
Value imagNumerator2 = rewriter.create <arith::SubFOp>(
319
325
loc, lhsImag,
320
- rewriter.create <arith::MulFOp>(loc, lhsReal, rhsImagRealRatio));
321
- Value resultImag2 =
322
- rewriter.create <arith::DivFOp>(loc, imagNumerator2, rhsImagRealDenom);
326
+ rewriter.create <arith::MulFOp>(loc, lhsReal, rhsImagRealRatio, fmf),
327
+ fmf);
328
+ Value resultImag2 = rewriter.create <arith::DivFOp>(loc, imagNumerator2,
329
+ rhsImagRealDenom, fmf);
323
330
324
331
// Consider corner cases.
325
332
// Case 1. Zero denominator, numerator contains at most one NaN value.
326
333
Value zero = rewriter.create <arith::ConstantOp>(
327
334
loc, elementType, rewriter.getZeroAttr (elementType));
328
- Value rhsRealAbs = rewriter.create <math::AbsFOp>(loc, rhsReal);
335
+ Value rhsRealAbs = rewriter.create <math::AbsFOp>(loc, rhsReal, fmf );
329
336
Value rhsRealIsZero = rewriter.create <arith::CmpFOp>(
330
337
loc, arith::CmpFPredicate::OEQ, rhsRealAbs, zero);
331
- Value rhsImagAbs = rewriter.create <math::AbsFOp>(loc, rhsImag);
338
+ Value rhsImagAbs = rewriter.create <math::AbsFOp>(loc, rhsImag, fmf );
332
339
Value rhsImagIsZero = rewriter.create <arith::CmpFOp>(
333
340
loc, arith::CmpFPredicate::OEQ, rhsImagAbs, zero);
334
341
Value lhsRealIsNotNaN = rewriter.create <arith::CmpFOp>(
@@ -347,9 +354,9 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
347
354
Value infWithSignOfRhsReal =
348
355
rewriter.create <math::CopySignOp>(loc, inf, rhsReal);
349
356
Value infinityResultReal =
350
- rewriter.create <arith::MulFOp>(loc, infWithSignOfRhsReal, lhsReal);
357
+ rewriter.create <arith::MulFOp>(loc, infWithSignOfRhsReal, lhsReal, fmf );
351
358
Value infinityResultImag =
352
- rewriter.create <arith::MulFOp>(loc, infWithSignOfRhsReal, lhsImag);
359
+ rewriter.create <arith::MulFOp>(loc, infWithSignOfRhsReal, lhsImag, fmf );
353
360
354
361
// Case 2. Infinite numerator, finite denominator.
355
362
Value rhsRealFinite = rewriter.create <arith::CmpFOp>(
@@ -358,10 +365,10 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
358
365
loc, arith::CmpFPredicate::ONE, rhsImagAbs, inf);
359
366
Value rhsFinite =
360
367
rewriter.create <arith::AndIOp>(loc, rhsRealFinite, rhsImagFinite);
361
- Value lhsRealAbs = rewriter.create <math::AbsFOp>(loc, lhsReal);
368
+ Value lhsRealAbs = rewriter.create <math::AbsFOp>(loc, lhsReal, fmf );
362
369
Value lhsRealInfinite = rewriter.create <arith::CmpFOp>(
363
370
loc, arith::CmpFPredicate::OEQ, lhsRealAbs, inf);
364
- Value lhsImagAbs = rewriter.create <math::AbsFOp>(loc, lhsImag);
371
+ Value lhsImagAbs = rewriter.create <math::AbsFOp>(loc, lhsImag, fmf );
365
372
Value lhsImagInfinite = rewriter.create <arith::CmpFOp>(
366
373
loc, arith::CmpFPredicate::OEQ, lhsImagAbs, inf);
367
374
Value lhsInfinite =
@@ -377,21 +384,23 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
377
384
loc, rewriter.create <arith::SelectOp>(loc, lhsImagInfinite, one, zero),
378
385
lhsImag);
379
386
Value lhsRealIsInfWithSignTimesRhsReal =
380
- rewriter.create <arith::MulFOp>(loc, lhsRealIsInfWithSign, rhsReal);
387
+ rewriter.create <arith::MulFOp>(loc, lhsRealIsInfWithSign, rhsReal, fmf );
381
388
Value lhsImagIsInfWithSignTimesRhsImag =
382
- rewriter.create <arith::MulFOp>(loc, lhsImagIsInfWithSign, rhsImag);
389
+ rewriter.create <arith::MulFOp>(loc, lhsImagIsInfWithSign, rhsImag, fmf );
383
390
Value resultReal3 = rewriter.create <arith::MulFOp>(
384
391
loc, inf,
385
392
rewriter.create <arith::AddFOp>(loc, lhsRealIsInfWithSignTimesRhsReal,
386
- lhsImagIsInfWithSignTimesRhsImag));
393
+ lhsImagIsInfWithSignTimesRhsImag, fmf),
394
+ fmf);
387
395
Value lhsRealIsInfWithSignTimesRhsImag =
388
- rewriter.create <arith::MulFOp>(loc, lhsRealIsInfWithSign, rhsImag);
396
+ rewriter.create <arith::MulFOp>(loc, lhsRealIsInfWithSign, rhsImag, fmf );
389
397
Value lhsImagIsInfWithSignTimesRhsReal =
390
- rewriter.create <arith::MulFOp>(loc, lhsImagIsInfWithSign, rhsReal);
398
+ rewriter.create <arith::MulFOp>(loc, lhsImagIsInfWithSign, rhsReal, fmf );
391
399
Value resultImag3 = rewriter.create <arith::MulFOp>(
392
400
loc, inf,
393
401
rewriter.create <arith::SubFOp>(loc, lhsImagIsInfWithSignTimesRhsReal,
394
- lhsRealIsInfWithSignTimesRhsImag));
402
+ lhsRealIsInfWithSignTimesRhsImag, fmf),
403
+ fmf);
395
404
396
405
// Case 3: Finite numerator, infinite denominator.
397
406
Value lhsRealFinite = rewriter.create <arith::CmpFOp>(
@@ -415,21 +424,23 @@ struct DivOpConversion : public OpConversionPattern<complex::DivOp> {
415
424
loc, rewriter.create <arith::SelectOp>(loc, rhsImagInfinite, one, zero),
416
425
rhsImag);
417
426
Value rhsRealIsInfWithSignTimesLhsReal =
418
- rewriter.create <arith::MulFOp>(loc, lhsReal, rhsRealIsInfWithSign);
427
+ rewriter.create <arith::MulFOp>(loc, lhsReal, rhsRealIsInfWithSign, fmf );
419
428
Value rhsImagIsInfWithSignTimesLhsImag =
420
- rewriter.create <arith::MulFOp>(loc, lhsImag, rhsImagIsInfWithSign);
429
+ rewriter.create <arith::MulFOp>(loc, lhsImag, rhsImagIsInfWithSign, fmf );
421
430
Value resultReal4 = rewriter.create <arith::MulFOp>(
422
431
loc, zero,
423
432
rewriter.create <arith::AddFOp>(loc, rhsRealIsInfWithSignTimesLhsReal,
424
- rhsImagIsInfWithSignTimesLhsImag));
433
+ rhsImagIsInfWithSignTimesLhsImag, fmf),
434
+ fmf);
425
435
Value rhsRealIsInfWithSignTimesLhsImag =
426
- rewriter.create <arith::MulFOp>(loc, lhsImag, rhsRealIsInfWithSign);
436
+ rewriter.create <arith::MulFOp>(loc, lhsImag, rhsRealIsInfWithSign, fmf );
427
437
Value rhsImagIsInfWithSignTimesLhsReal =
428
- rewriter.create <arith::MulFOp>(loc, lhsReal, rhsImagIsInfWithSign);
438
+ rewriter.create <arith::MulFOp>(loc, lhsReal, rhsImagIsInfWithSign, fmf );
429
439
Value resultImag4 = rewriter.create <arith::MulFOp>(
430
440
loc, zero,
431
441
rewriter.create <arith::SubFOp>(loc, rhsRealIsInfWithSignTimesLhsImag,
432
- rhsImagIsInfWithSignTimesLhsReal));
442
+ rhsImagIsInfWithSignTimesLhsReal, fmf),
443
+ fmf);
433
444
434
445
Value realAbsSmallerThanImagAbs = rewriter.create <arith::CmpFOp>(
435
446
loc, arith::CmpFPredicate::OLT, rhsRealAbs, rhsImagAbs);
0 commit comments