Skip to content

Commit 36998cc

Browse files
committed
InstCombine: Add baseline test for ldexp by constant combine
1 parent b63c6e5 commit 36998cc

File tree

1 file changed

+302
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+302
-0
lines changed

llvm/test/Transforms/InstCombine/ldexp.ll

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,18 @@ define float @ldexp_reassoc_ldexp_reassoc(float %x, i32 %a, i32 %b) {
377377
ret float %ldexp1
378378
}
379379

380+
define float @ldexp_reassoc_nsz_ldexp_reassoc_nsz(float %x, i32 %a, i32 %b) {
381+
; CHECK-LABEL: define float @ldexp_reassoc_nsz_ldexp_reassoc_nsz
382+
; CHECK-SAME: (float [[X:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) {
383+
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[A]], [[B]]
384+
; CHECK-NEXT: [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 [[TMP1]])
385+
; CHECK-NEXT: ret float [[LDEXP1]]
386+
;
387+
%ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 %a)
388+
%ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 %b)
389+
ret float %ldexp1
390+
}
391+
380392
; Test that we or the inner and outer flags
381393
define float @ldexp_reassoc_ldexp_reassoc_preserve_flags(float %x, i32 %a, i32 %b) {
382394
; CHECK-LABEL: define float @ldexp_reassoc_ldexp_reassoc_preserve_flags
@@ -440,6 +452,39 @@ define float @ldexp_ldexp_constants(float %x) {
440452
ret float %ldexp1
441453
}
442454

455+
define float @ldexp_ldexp_constants_nsz(float %x) {
456+
; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz
457+
; CHECK-SAME: (float [[X:%.*]]) {
458+
; CHECK-NEXT: [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)
459+
; CHECK-NEXT: ret float [[LDEXP1]]
460+
;
461+
%ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 8)
462+
%ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)
463+
ret float %ldexp1
464+
}
465+
466+
define float @ldexp_ldexp_constants_nsz0(float %x) {
467+
; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz0
468+
; CHECK-SAME: (float [[X:%.*]]) {
469+
; CHECK-NEXT: [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)
470+
; CHECK-NEXT: ret float [[LDEXP1]]
471+
;
472+
%ldexp0 = call reassoc nsz float @llvm.ldexp.f32.i32(float %x, i32 8)
473+
%ldexp1 = call reassoc float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)
474+
ret float %ldexp1
475+
}
476+
477+
define float @ldexp_ldexp_constants_nsz1(float %x) {
478+
; CHECK-LABEL: define float @ldexp_ldexp_constants_nsz1
479+
; CHECK-SAME: (float [[X:%.*]]) {
480+
; CHECK-NEXT: [[LDEXP1:%.*]] = call reassoc nsz float @llvm.ldexp.f32.i32(float [[X]], i32 32)
481+
; CHECK-NEXT: ret float [[LDEXP1]]
482+
;
483+
%ldexp0 = call reassoc float @llvm.ldexp.f32.i32(float %x, i32 8)
484+
%ldexp1 = call reassoc nsz float @llvm.ldexp.f32.i32(float %ldexp0, i32 24)
485+
ret float %ldexp1
486+
}
487+
443488
define float @ldexp_ldexp_opposite_constants(float %x) {
444489
; CHECK-LABEL: define float @ldexp_ldexp_opposite_constants
445490
; CHECK-SAME: (float [[X:%.*]]) {
@@ -592,5 +637,262 @@ define float @ldexp_ldexp_0(float %x, i32 %y) {
592637
ret float %ldexp1
593638
}
594639

640+
;---------------------------------------------------------------------
641+
; ldexp(x, k) -> fmul x, 2**k
642+
;---------------------------------------------------------------------
643+
644+
define float @ldexp_neg150(float %x) {
645+
; CHECK-LABEL: define float @ldexp_neg150
646+
; CHECK-SAME: (float [[X:%.*]]) {
647+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -150)
648+
; CHECK-NEXT: ret float [[LDEXP]]
649+
;
650+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -150)
651+
ret float %ldexp
652+
}
653+
654+
define float @ldexp_neg149(float %x) {
655+
; CHECK-LABEL: define float @ldexp_neg149
656+
; CHECK-SAME: (float [[X:%.*]]) {
657+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -149)
658+
; CHECK-NEXT: ret float [[LDEXP]]
659+
;
660+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -149)
661+
ret float %ldexp
662+
}
663+
664+
define float @ldexp_neg148(float %x) {
665+
; CHECK-LABEL: define float @ldexp_neg148
666+
; CHECK-SAME: (float [[X:%.*]]) {
667+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -148)
668+
; CHECK-NEXT: ret float [[LDEXP]]
669+
;
670+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -148)
671+
ret float %ldexp
672+
}
673+
674+
define float @ldexp_neg127(float %x) {
675+
; CHECK-LABEL: define float @ldexp_neg127
676+
; CHECK-SAME: (float [[X:%.*]]) {
677+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -127)
678+
; CHECK-NEXT: ret float [[LDEXP]]
679+
;
680+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -127)
681+
ret float %ldexp
682+
}
683+
684+
define float @ldexp_neg126(float %x) {
685+
; CHECK-LABEL: define float @ldexp_neg126
686+
; CHECK-SAME: (float [[X:%.*]]) {
687+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -126)
688+
; CHECK-NEXT: ret float [[LDEXP]]
689+
;
690+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -126)
691+
ret float %ldexp
692+
}
693+
694+
define float @ldexp_neg125(float %x) {
695+
; CHECK-LABEL: define float @ldexp_neg125
696+
; CHECK-SAME: (float [[X:%.*]]) {
697+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -125)
698+
; CHECK-NEXT: ret float [[LDEXP]]
699+
;
700+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -125)
701+
ret float %ldexp
702+
}
703+
704+
define float @ldexp_neg16(float %x) {
705+
; CHECK-LABEL: define float @ldexp_neg16
706+
; CHECK-SAME: (float [[X:%.*]]) {
707+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -16)
708+
; CHECK-NEXT: ret float [[LDEXP]]
709+
;
710+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -16)
711+
ret float %ldexp
712+
}
713+
714+
define float @ldexp_neg8(float %x) {
715+
; CHECK-LABEL: define float @ldexp_neg8
716+
; CHECK-SAME: (float [[X:%.*]]) {
717+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -8)
718+
; CHECK-NEXT: ret float [[LDEXP]]
719+
;
720+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -8)
721+
ret float %ldexp
722+
}
723+
724+
define float @ldexp_neg4(float %x) {
725+
; CHECK-LABEL: define float @ldexp_neg4
726+
; CHECK-SAME: (float [[X:%.*]]) {
727+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -4)
728+
; CHECK-NEXT: ret float [[LDEXP]]
729+
;
730+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -4)
731+
ret float %ldexp
732+
}
733+
734+
define float @ldexp_neg2(float %x) {
735+
; CHECK-LABEL: define float @ldexp_neg2
736+
; CHECK-SAME: (float [[X:%.*]]) {
737+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -2)
738+
; CHECK-NEXT: ret float [[LDEXP]]
739+
;
740+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -2)
741+
ret float %ldexp
742+
}
743+
744+
define float @ldexp_neg1(float %x) {
745+
; CHECK-LABEL: define float @ldexp_neg1
746+
; CHECK-SAME: (float [[X:%.*]]) {
747+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 -1)
748+
; CHECK-NEXT: ret float [[LDEXP]]
749+
;
750+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 -1)
751+
ret float %ldexp
752+
}
753+
754+
define float @ldexp_0(float %x) {
755+
; CHECK-LABEL: define float @ldexp_0
756+
; CHECK-SAME: (float [[X:%.*]]) {
757+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 0)
758+
; CHECK-NEXT: ret float [[LDEXP]]
759+
;
760+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 0)
761+
ret float %ldexp
762+
}
763+
764+
define float @ldexp_1(float %x) {
765+
; CHECK-LABEL: define float @ldexp_1
766+
; CHECK-SAME: (float [[X:%.*]]) {
767+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 1)
768+
; CHECK-NEXT: ret float [[LDEXP]]
769+
;
770+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 1)
771+
ret float %ldexp
772+
}
773+
774+
define float @ldexp_2(float %x) {
775+
; CHECK-LABEL: define float @ldexp_2
776+
; CHECK-SAME: (float [[X:%.*]]) {
777+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2)
778+
; CHECK-NEXT: ret float [[LDEXP]]
779+
;
780+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 2)
781+
ret float %ldexp
782+
}
783+
784+
define float @ldexp_3(float %x) {
785+
; CHECK-LABEL: define float @ldexp_3
786+
; CHECK-SAME: (float [[X:%.*]]) {
787+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 3)
788+
; CHECK-NEXT: ret float [[LDEXP]]
789+
;
790+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 3)
791+
ret float %ldexp
792+
}
793+
794+
define float @ldexp_10(float %x) {
795+
; CHECK-LABEL: define float @ldexp_10
796+
; CHECK-SAME: (float [[X:%.*]]) {
797+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 10)
798+
; CHECK-NEXT: ret float [[LDEXP]]
799+
;
800+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 10)
801+
ret float %ldexp
802+
}
803+
804+
define float @ldexp_125(float %x) {
805+
; CHECK-LABEL: define float @ldexp_125
806+
; CHECK-SAME: (float [[X:%.*]]) {
807+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 125)
808+
; CHECK-NEXT: ret float [[LDEXP]]
809+
;
810+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 125)
811+
ret float %ldexp
812+
}
813+
814+
define float @ldexp_126(float %x) {
815+
; CHECK-LABEL: define float @ldexp_126
816+
; CHECK-SAME: (float [[X:%.*]]) {
817+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 126)
818+
; CHECK-NEXT: ret float [[LDEXP]]
819+
;
820+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 126)
821+
ret float %ldexp
822+
}
823+
824+
define float @ldexp_127(float %x) {
825+
; CHECK-LABEL: define float @ldexp_127
826+
; CHECK-SAME: (float [[X:%.*]]) {
827+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 127)
828+
; CHECK-NEXT: ret float [[LDEXP]]
829+
;
830+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 127)
831+
ret float %ldexp
832+
}
833+
834+
define <2 x float> @ldexp_3_vector(<2 x float> %x) {
835+
; CHECK-LABEL: define <2 x float> @ldexp_3_vector
836+
; CHECK-SAME: (<2 x float> [[X:%.*]]) {
837+
; CHECK-NEXT: [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> <i32 3, i32 3>)
838+
; CHECK-NEXT: ret <2 x float> [[LDEXP]]
839+
;
840+
%ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 3>)
841+
ret <2 x float> %ldexp
842+
}
843+
844+
define <2 x float> @ldexp_3_undef_vector(<2 x float> %x) {
845+
; CHECK-LABEL: define <2 x float> @ldexp_3_undef_vector
846+
; CHECK-SAME: (<2 x float> [[X:%.*]]) {
847+
; CHECK-NEXT: [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> <i32 3, i32 poison>)
848+
; CHECK-NEXT: ret <2 x float> [[LDEXP]]
849+
;
850+
%ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 poison>)
851+
ret <2 x float> %ldexp
852+
}
853+
854+
define <2 x float> @ldexp_3_4_vector(<2 x float> %x) {
855+
; CHECK-LABEL: define <2 x float> @ldexp_3_4_vector
856+
; CHECK-SAME: (<2 x float> [[X:%.*]]) {
857+
; CHECK-NEXT: [[LDEXP:%.*]] = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> [[X]], <2 x i32> <i32 3, i32 4>)
858+
; CHECK-NEXT: ret <2 x float> [[LDEXP]]
859+
;
860+
%ldexp = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %x, <2 x i32> <i32 3, i32 4>)
861+
ret <2 x float> %ldexp
862+
}
863+
864+
define float @ldexp_2_flags(float %x) {
865+
; CHECK-LABEL: define float @ldexp_2_flags
866+
; CHECK-SAME: (float [[X:%.*]]) {
867+
; CHECK-NEXT: [[LDEXP:%.*]] = call nsz contract float @llvm.ldexp.f32.i32(float [[X]], i32 2)
868+
; CHECK-NEXT: ret float [[LDEXP]]
869+
;
870+
%ldexp = call contract nsz float @llvm.ldexp.f32.i32(float %x, i32 2)
871+
ret float %ldexp
872+
}
873+
874+
define float @ldexp_metadata(float %x) {
875+
; CHECK-LABEL: define float @ldexp_metadata
876+
; CHECK-SAME: (float [[X:%.*]]) {
877+
; CHECK-NEXT: [[LDEXP:%.*]] = call float @llvm.ldexp.f32.i32(float [[X]], i32 2), !foo !2
878+
; CHECK-NEXT: ret float [[LDEXP]]
879+
;
880+
%ldexp = call float @llvm.ldexp.f32.i32(float %x, i32 2), !foo !2
881+
ret float %ldexp
882+
}
883+
884+
define float @ldexp_8_contractable(float %x, float %y) {
885+
; CHECK-LABEL: define float @ldexp_8_contractable
886+
; CHECK-SAME: (float [[X:%.*]], float [[Y:%.*]]) {
887+
; CHECK-NEXT: [[LDEXP:%.*]] = call contract float @llvm.ldexp.f32.i32(float [[X]], i32 2)
888+
; CHECK-NEXT: [[FADD:%.*]] = fadd contract float [[LDEXP]], [[Y]]
889+
; CHECK-NEXT: ret float [[FADD]]
890+
;
891+
%ldexp = call contract float @llvm.ldexp.f32.i32(float %x, i32 2)
892+
%fadd = fadd contract float %ldexp, %y
893+
ret float %fadd
894+
}
895+
595896
!0 = !{i32 -127, i32 0}
596897
!1 = !{i32 0, i32 127}
898+
!2 = !{}

0 commit comments

Comments
 (0)