@@ -471,3 +471,173 @@ define float @fdiv_fsub_denorm(float %x) {
471
471
ret float %r
472
472
}
473
473
474
+ define float @lerp_commute0 (float %a , float %b , float %c ) {
475
+ ; CHECK-LABEL: @lerp_commute0(
476
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast float 1.000000e+00, [[C:%.*]]
477
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUB]], [[A:%.*]]
478
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast float [[C]], [[B:%.*]]
479
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast float [[MUL]], [[BC]]
480
+ ; CHECK-NEXT: ret float [[ADD]]
481
+ ;
482
+ %sub = fsub fast float 1 .0 , %c
483
+ %mul = fmul fast float %sub , %a
484
+ %bc = fmul fast float %c , %b
485
+ %add = fadd fast float %mul , %bc
486
+ ret float %add
487
+ }
488
+
489
+ define <2 x float > @lerp_commute1 (<2 x float > %a , <2 x float > %b , <2 x float > %c ) {
490
+ ; CHECK-LABEL: @lerp_commute1(
491
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub <2 x float> <float 1.000000e+00, float 1.000000e+00>, [[C:%.*]]
492
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul <2 x float> [[SUB]], [[A:%.*]]
493
+ ; CHECK-NEXT: [[BC:%.*]] = fmul <2 x float> [[C]], [[B:%.*]]
494
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast <2 x float> [[BC]], [[MUL]]
495
+ ; CHECK-NEXT: ret <2 x float> [[ADD]]
496
+ ;
497
+ %sub = fsub <2 x float > <float 1 .0 , float 1 .0 >, %c
498
+ %mul = fmul <2 x float > %sub , %a
499
+ %bc = fmul <2 x float > %c , %b
500
+ %add = fadd fast <2 x float > %bc , %mul
501
+ ret <2 x float > %add
502
+ }
503
+
504
+ define float @lerp_commute2 (float %a , float %b , float %c ) {
505
+ ; CHECK-LABEL: @lerp_commute2(
506
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub float 1.000000e+00, [[C:%.*]]
507
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul float [[SUB]], [[A:%.*]]
508
+ ; CHECK-NEXT: [[BC:%.*]] = fmul float [[B:%.*]], [[C]]
509
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc nsz float [[MUL]], [[BC]]
510
+ ; CHECK-NEXT: ret float [[ADD]]
511
+ ;
512
+ %sub = fsub float 1 .0 , %c
513
+ %mul = fmul float %sub , %a
514
+ %bc = fmul float %b , %c
515
+ %add = fadd reassoc nsz float %mul , %bc
516
+ ret float %add
517
+ }
518
+
519
+ define float @lerp_commute3 (float %a , float %b , float %c ) {
520
+ ; CHECK-LABEL: @lerp_commute3(
521
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast float 1.000000e+00, [[C:%.*]]
522
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul float [[SUB]], [[A:%.*]]
523
+ ; CHECK-NEXT: [[BC:%.*]] = fmul float [[B:%.*]], [[C]]
524
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd reassoc ninf nsz float [[BC]], [[MUL]]
525
+ ; CHECK-NEXT: ret float [[ADD]]
526
+ ;
527
+ %sub = fsub fast float 1 .0 , %c
528
+ %mul = fmul float %sub , %a
529
+ %bc = fmul float %b , %c
530
+ %add = fadd reassoc nsz ninf float %bc , %mul
531
+ ret float %add
532
+ }
533
+
534
+ define double @lerp_commute4 (double %a , double %b , double %c ) {
535
+ ; CHECK-LABEL: @lerp_commute4(
536
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast double 1.000000e+00, [[C:%.*]]
537
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[SUB]], [[A:%.*]]
538
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast double [[C]], [[B:%.*]]
539
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast double [[MUL]], [[BC]]
540
+ ; CHECK-NEXT: ret double [[ADD]]
541
+ ;
542
+ %sub = fsub fast double 1 .0 , %c
543
+ %mul = fmul fast double %a , %sub
544
+ %bc = fmul fast double %c , %b
545
+ %add = fadd fast double %mul , %bc
546
+ ret double %add
547
+ }
548
+
549
+ define double @lerp_commute5 (double %a , double %b , double %c ) {
550
+ ; CHECK-LABEL: @lerp_commute5(
551
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast double 1.000000e+00, [[C:%.*]]
552
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[SUB]], [[A:%.*]]
553
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast double [[C]], [[B:%.*]]
554
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast double [[BC]], [[MUL]]
555
+ ; CHECK-NEXT: ret double [[ADD]]
556
+ ;
557
+ %sub = fsub fast double 1 .0 , %c
558
+ %mul = fmul fast double %a , %sub
559
+ %bc = fmul fast double %c , %b
560
+ %add = fadd fast double %bc , %mul
561
+ ret double %add
562
+ }
563
+
564
+ define half @lerp_commute6 (half %a , half %b , half %c ) {
565
+ ; CHECK-LABEL: @lerp_commute6(
566
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast half 0xH3C00, [[C:%.*]]
567
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast half [[SUB]], [[A:%.*]]
568
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast half [[B:%.*]], [[C]]
569
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast half [[MUL]], [[BC]]
570
+ ; CHECK-NEXT: ret half [[ADD]]
571
+ ;
572
+ %sub = fsub fast half 1 .0 , %c
573
+ %mul = fmul fast half %a , %sub
574
+ %bc = fmul fast half %b , %c
575
+ %add = fadd fast half %mul , %bc
576
+ ret half %add
577
+ }
578
+
579
+ define half @lerp_commute7 (half %a , half %b , half %c ) {
580
+ ; CHECK-LABEL: @lerp_commute7(
581
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast half 0xH3C00, [[C:%.*]]
582
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast half [[SUB]], [[A:%.*]]
583
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast half [[B:%.*]], [[C]]
584
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast half [[BC]], [[MUL]]
585
+ ; CHECK-NEXT: ret half [[ADD]]
586
+ ;
587
+ %sub = fsub fast half 1 .0 , %c
588
+ %mul = fmul fast half %a , %sub
589
+ %bc = fmul fast half %b , %c
590
+ %add = fadd fast half %bc , %mul
591
+ ret half %add
592
+ }
593
+
594
+ define float @lerp_extra_use1 (float %a , float %b , float %c ) {
595
+ ; CHECK-LABEL: @lerp_extra_use1(
596
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast float 1.000000e+00, [[C:%.*]]
597
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUB]], [[A:%.*]]
598
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast float [[B:%.*]], [[C]]
599
+ ; CHECK-NEXT: call void @use(float [[BC]])
600
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast float [[BC]], [[MUL]]
601
+ ; CHECK-NEXT: ret float [[ADD]]
602
+ ;
603
+ %sub = fsub fast float 1 .0 , %c
604
+ %mul = fmul fast float %a , %sub
605
+ %bc = fmul fast float %b , %c
606
+ call void @use (float %bc )
607
+ %add = fadd fast float %bc , %mul
608
+ ret float %add
609
+ }
610
+
611
+ define float @lerp_extra_use2 (float %a , float %b , float %c ) {
612
+ ; CHECK-LABEL: @lerp_extra_use2(
613
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast float 1.000000e+00, [[C:%.*]]
614
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUB]], [[A:%.*]]
615
+ ; CHECK-NEXT: call void @use(float [[MUL]])
616
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast float [[B:%.*]], [[C]]
617
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast float [[BC]], [[MUL]]
618
+ ; CHECK-NEXT: ret float [[ADD]]
619
+ ;
620
+ %sub = fsub fast float 1 .0 , %c
621
+ %mul = fmul fast float %a , %sub
622
+ call void @use (float %mul )
623
+ %bc = fmul fast float %b , %c
624
+ %add = fadd fast float %bc , %mul
625
+ ret float %add
626
+ }
627
+
628
+ define float @lerp_extra_use3 (float %a , float %b , float %c ) {
629
+ ; CHECK-LABEL: @lerp_extra_use3(
630
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub fast float 1.000000e+00, [[C:%.*]]
631
+ ; CHECK-NEXT: call void @use(float [[SUB]])
632
+ ; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SUB]], [[A:%.*]]
633
+ ; CHECK-NEXT: [[BC:%.*]] = fmul fast float [[B:%.*]], [[C]]
634
+ ; CHECK-NEXT: [[ADD:%.*]] = fadd fast float [[BC]], [[MUL]]
635
+ ; CHECK-NEXT: ret float [[ADD]]
636
+ ;
637
+ %sub = fsub fast float 1 .0 , %c
638
+ call void @use (float %sub )
639
+ %mul = fmul fast float %a , %sub
640
+ %bc = fmul fast float %b , %c
641
+ %add = fadd fast float %bc , %mul
642
+ ret float %add
643
+ }
0 commit comments