@@ -697,3 +697,200 @@ llvm.func @transitive_reaching_def() -> !llvm.ptr {
697
697
%3 = llvm.load %1 {alignment = 8 : i64 } : !llvm.ptr -> !llvm.ptr
698
698
llvm.return %3 : !llvm.ptr
699
699
}
700
+
701
+ // -----
702
+
703
+ // CHECK-LABEL: @load_int_from_float
704
+ llvm.func @load_int_from_float () -> i32 {
705
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
706
+ // CHECK-NOT: llvm.alloca
707
+ %1 = llvm.alloca %0 x f32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
708
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i32
709
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
710
+ // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[UNDEF]] : f32 to i32
711
+ // CHECK: llvm.return %[[BITCAST:.*]]
712
+ llvm.return %2 : i32
713
+ }
714
+
715
+ // -----
716
+
717
+ // CHECK-LABEL: @load_float_from_int
718
+ llvm.func @load_float_from_int () -> f32 {
719
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
720
+ // CHECK-NOT: llvm.alloca
721
+ %1 = llvm.alloca %0 x i32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
722
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> f32
723
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
724
+ // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[UNDEF]] : i32 to f32
725
+ // CHECK: llvm.return %[[BITCAST:.*]]
726
+ llvm.return %2 : f32
727
+ }
728
+
729
+ // -----
730
+
731
+ // CHECK-LABEL: @load_int_from_vector
732
+ llvm.func @load_int_from_vector () -> i32 {
733
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
734
+ // CHECK-NOT: llvm.alloca
735
+ %1 = llvm.alloca %0 x vector <2 xi16 > : (i32 ) -> !llvm.ptr
736
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i32
737
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
738
+ // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[UNDEF]] : vector<2xi16> to i32
739
+ // CHECK: llvm.return %[[BITCAST:.*]]
740
+ llvm.return %2 : i32
741
+ }
742
+
743
+ // -----
744
+
745
+ // LLVM arrays cannot be bitcasted, so the following cannot be promoted.
746
+
747
+ // CHECK-LABEL: @load_int_from_array
748
+ llvm.func @load_int_from_array () -> i32 {
749
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
750
+ // CHECK: llvm.alloca
751
+ %1 = llvm.alloca %0 x !llvm.array <2 x i16 > : (i32 ) -> !llvm.ptr
752
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i32
753
+ // CHECK-NOT: llvm.bitcast
754
+ llvm.return %2 : i32
755
+ }
756
+
757
+ // -----
758
+
759
+ // CHECK-LABEL: @store_int_to_float
760
+ // CHECK-SAME: %[[ARG:.*]]: i32
761
+ llvm.func @store_int_to_float (%arg: i32 ) -> i32 {
762
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
763
+ // CHECK-NOT: llvm.alloca
764
+ %1 = llvm.alloca %0 x f32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
765
+ llvm.store %arg , %1 {alignment = 4 : i64 } : i32 , !llvm.ptr
766
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i32
767
+ // CHECK: llvm.return %[[ARG]]
768
+ llvm.return %2 : i32
769
+ }
770
+
771
+ // -----
772
+
773
+ // CHECK-LABEL: @store_float_to_int
774
+ // CHECK-SAME: %[[ARG:.*]]: f32
775
+ llvm.func @store_float_to_int (%arg: f32 ) -> i32 {
776
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
777
+ // CHECK-NOT: llvm.alloca
778
+ %1 = llvm.alloca %0 x i32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
779
+ llvm.store %arg , %1 {alignment = 4 : i64 } : f32 , !llvm.ptr
780
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i32
781
+ // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[ARG]] : f32 to i32
782
+ // CHECK: llvm.return %[[BITCAST]]
783
+ llvm.return %2 : i32
784
+ }
785
+
786
+ // -----
787
+
788
+ // CHECK-LABEL: @store_int_to_vector
789
+ // CHECK-SAME: %[[ARG:.*]]: i32
790
+ llvm.func @store_int_to_vector (%arg: i32 ) -> vector <4 xi8 > {
791
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
792
+ // CHECK-NOT: llvm.alloca
793
+ %1 = llvm.alloca %0 x vector <2 xi16 > {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
794
+ llvm.store %arg , %1 {alignment = 4 : i64 } : i32 , !llvm.ptr
795
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> vector <4 xi8 >
796
+ // CHECK: %[[BITCAST:.*]] = llvm.bitcast %[[ARG]] : i32 to vector<4xi8>
797
+ // CHECK: llvm.return %[[BITCAST]]
798
+ llvm.return %2 : vector <4 xi8 >
799
+ }
800
+
801
+ // -----
802
+
803
+ // CHECK-LABEL: @load_ptr_from_int
804
+ llvm.func @load_ptr_from_int () -> !llvm.ptr {
805
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
806
+ // CHECK-NOT: llvm.alloca
807
+ %1 = llvm.alloca %0 x i64 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
808
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> !llvm.ptr
809
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
810
+ // CHECK: %[[CAST:.*]] = llvm.inttoptr %[[UNDEF]] : i64 to !llvm.ptr
811
+ // CHECK: llvm.return %[[CAST:.*]]
812
+ llvm.return %2 : !llvm.ptr
813
+ }
814
+
815
+ // -----
816
+
817
+ // CHECK-LABEL: @load_int_from_ptr
818
+ llvm.func @load_int_from_ptr () -> i64 {
819
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
820
+ // CHECK-NOT: llvm.alloca
821
+ %1 = llvm.alloca %0 x !llvm.ptr {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
822
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i64
823
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
824
+ // CHECK: %[[CAST:.*]] = llvm.ptrtoint %[[UNDEF]] : !llvm.ptr to i64
825
+ // CHECK: llvm.return %[[CAST:.*]]
826
+ llvm.return %2 : i64
827
+ }
828
+
829
+ // -----
830
+
831
+ // CHECK-LABEL: @load_ptr_addrspace_cast
832
+ llvm.func @load_ptr_addrspace_cast () -> !llvm.ptr <2 > {
833
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
834
+ // CHECK-NOT: llvm.alloca
835
+ %1 = llvm.alloca %0 x !llvm.ptr <1 > {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
836
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> !llvm.ptr <2 >
837
+ // CHECK: %[[UNDEF:.*]] = llvm.mlir.undef
838
+ // CHECK: %[[CAST:.*]] = llvm.addrspacecast %[[UNDEF]] : !llvm.ptr<1> to !llvm.ptr<2>
839
+ // CHECK: llvm.return %[[CAST:.*]]
840
+ llvm.return %2 : !llvm.ptr <2 >
841
+ }
842
+
843
+ // -----
844
+
845
+ // CHECK-LABEL: @load_smaller_int
846
+ llvm.func @load_smaller_int () -> i16 {
847
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
848
+ // CHECK: llvm.alloca
849
+ %1 = llvm.alloca %0 x i32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
850
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> i16
851
+ llvm.return %2 : i16
852
+ }
853
+
854
+ // -----
855
+
856
+ // CHECK-LABEL: @load_different_type_smaller
857
+ llvm.func @load_different_type_smaller () -> f32 {
858
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
859
+ // CHECK: llvm.alloca
860
+ %1 = llvm.alloca %0 x i64 {alignment = 8 : i64 } : (i32 ) -> !llvm.ptr
861
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> f32
862
+ llvm.return %2 : f32
863
+ }
864
+
865
+ // -----
866
+
867
+ // This alloca is too small for the load, still, mem2reg should not touch it.
868
+
869
+ // CHECK-LABEL: @impossible_load
870
+ llvm.func @impossible_load () -> f64 {
871
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
872
+ // CHECK: llvm.alloca
873
+ %1 = llvm.alloca %0 x i32 {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
874
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> f64
875
+ llvm.return %2 : f64
876
+ }
877
+
878
+ // -----
879
+
880
+ // Verifies that mem2reg does not introduce address space casts of pointers
881
+ // with different bitsize.
882
+
883
+ module attributes { dlti.dl_spec = #dlti.dl_spec <
884
+ #dlti.dl_entry <!llvm.ptr <1 >, dense <[32 , 64 , 64 ]> : vector <3 xi64 >>,
885
+ #dlti.dl_entry <!llvm.ptr <2 >, dense <[64 , 64 , 64 ]> : vector <3 xi64 >>
886
+ >} {
887
+
888
+ // CHECK-LABEL: @load_ptr_addrspace_cast_different_size
889
+ llvm.func @load_ptr_addrspace_cast_different_size () -> !llvm.ptr <2 > {
890
+ %0 = llvm.mlir.constant (1 : i32 ) : i32
891
+ // CHECK: llvm.alloca
892
+ %1 = llvm.alloca %0 x !llvm.ptr <1 > {alignment = 4 : i64 } : (i32 ) -> !llvm.ptr
893
+ %2 = llvm.load %1 {alignment = 4 : i64 } : !llvm.ptr -> !llvm.ptr <2 >
894
+ llvm.return %2 : !llvm.ptr <2 >
895
+ }
896
+ }
0 commit comments