@@ -377,6 +377,18 @@ define float @ldexp_reassoc_ldexp_reassoc(float %x, i32 %a, i32 %b) {
377
377
ret float %ldexp1
378
378
}
379
379
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
+
380
392
; Test that we or the inner and outer flags
381
393
define float @ldexp_reassoc_ldexp_reassoc_preserve_flags (float %x , i32 %a , i32 %b ) {
382
394
; CHECK-LABEL: define float @ldexp_reassoc_ldexp_reassoc_preserve_flags
@@ -440,6 +452,39 @@ define float @ldexp_ldexp_constants(float %x) {
440
452
ret float %ldexp1
441
453
}
442
454
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
+
443
488
define float @ldexp_ldexp_opposite_constants (float %x ) {
444
489
; CHECK-LABEL: define float @ldexp_ldexp_opposite_constants
445
490
; CHECK-SAME: (float [[X:%.*]]) {
@@ -592,5 +637,262 @@ define float @ldexp_ldexp_0(float %x, i32 %y) {
592
637
ret float %ldexp1
593
638
}
594
639
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
+
595
896
!0 = !{i32 -127 , i32 0 }
596
897
!1 = !{i32 0 , i32 127 }
898
+ !2 = !{}
0 commit comments