Skip to content

Commit 8f15d40

Browse files
committed
[InstCombine] add tests for lerp patterns (PR42716); NFC
llvm-svn: 367069
1 parent 0503add commit 8f15d40

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed

llvm/test/Transforms/InstCombine/fadd-fsub-factor.ll

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,173 @@ define float @fdiv_fsub_denorm(float %x) {
471471
ret float %r
472472
}
473473

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

Comments
 (0)