xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-bzero.mir (revision d86a7d631c32341fd86fa5ecd247957cdb2c58d1)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple aarch64-apple-ios -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=DARWIN
3# RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=UNKNOWN
4#
5# Check that on Darwin we can combine to G_BZERO. Without Darwin, this should
6# stay as memset.
7
8--- |
9  define void @bzero_unknown_width() { unreachable }
10  define void @bzero_tail_unknown_width() { unreachable }
11  define void @bzero_constant_width() { unreachable }
12  define void @bzero_constant_width_minsize() minsize { unreachable }
13  define void @not_zero() minsize { unreachable }
14...
15---
16name:            bzero_unknown_width
17tracksRegLiveness: true
18body:             |
19  bb.0:
20    liveins: $x0, $x1
21    ; Always use G_BZERO when the memset width is unknown on Darwin.
22
23    ; DARWIN-LABEL: name: bzero_unknown_width
24    ; DARWIN: liveins: $x0, $x1
25    ; DARWIN-NEXT: {{  $}}
26    ; DARWIN-NEXT: %ptr:_(p0) = COPY $x0
27    ; DARWIN-NEXT: %width:_(s64) = COPY $x1
28    ; DARWIN-NEXT: G_BZERO %ptr(p0), %width(s64), 0 :: (store (s32))
29    ; DARWIN-NEXT: RET_ReallyLR
30    ;
31    ; UNKNOWN-LABEL: name: bzero_unknown_width
32    ; UNKNOWN: liveins: $x0, $x1
33    ; UNKNOWN-NEXT: {{  $}}
34    ; UNKNOWN-NEXT: %ptr:_(p0) = COPY $x0
35    ; UNKNOWN-NEXT: %zero:_(s8) = G_CONSTANT i8 0
36    ; UNKNOWN-NEXT: %width:_(s64) = COPY $x1
37    ; UNKNOWN-NEXT: G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
38    ; UNKNOWN-NEXT: RET_ReallyLR
39    %ptr:_(p0) = COPY $x0
40    %zero:_(s8) = G_CONSTANT i8 0
41    %width:_(s64) = COPY $x1
42    G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
43    RET_ReallyLR
44...
45---
46name:            bzero_tail_unknown_width
47tracksRegLiveness: true
48body:             |
49  bb.0:
50    liveins: $x0, $x1
51    ; DARWIN-LABEL: name: bzero_tail_unknown_width
52    ; DARWIN: liveins: $x0, $x1
53    ; DARWIN-NEXT: {{  $}}
54    ; DARWIN-NEXT: %ptr:_(p0) = COPY $x0
55    ; DARWIN-NEXT: %width:_(s64) = COPY $x1
56    ; DARWIN-NEXT: G_BZERO %ptr(p0), %width(s64), 1 :: (store (s32))
57    ; DARWIN-NEXT: RET_ReallyLR
58    ;
59    ; UNKNOWN-LABEL: name: bzero_tail_unknown_width
60    ; UNKNOWN: liveins: $x0, $x1
61    ; UNKNOWN-NEXT: {{  $}}
62    ; UNKNOWN-NEXT: %ptr:_(p0) = COPY $x0
63    ; UNKNOWN-NEXT: %zero:_(s8) = G_CONSTANT i8 0
64    ; UNKNOWN-NEXT: %width:_(s64) = COPY $x1
65    ; UNKNOWN-NEXT: G_MEMSET %ptr(p0), %zero(s8), %width(s64), 1 :: (store (s32))
66    ; UNKNOWN-NEXT: RET_ReallyLR
67    %ptr:_(p0) = COPY $x0
68    %zero:_(s8) = G_CONSTANT i8 0
69    %width:_(s64) = COPY $x1
70    G_MEMSET %ptr(p0), %zero(s8), %width(s64), 1 :: (store (s32))
71    RET_ReallyLR
72...
73---
74name:            bzero_constant_width
75tracksRegLiveness: true
76body:             |
77  bb.0:
78    liveins: $x0, $x1
79    ; For values >256, we should use G_BZERO on Darwin.
80
81    ; DARWIN-LABEL: name: bzero_constant_width
82    ; DARWIN: liveins: $x0, $x1
83    ; DARWIN-NEXT: {{  $}}
84    ; DARWIN-NEXT: %ptr:_(p0) = COPY $x0
85    ; DARWIN-NEXT: %width:_(s64) = G_CONSTANT i64 1024
86    ; DARWIN-NEXT: G_BZERO %ptr(p0), %width(s64), 0 :: (store (s32))
87    ; DARWIN-NEXT: RET_ReallyLR
88    ;
89    ; UNKNOWN-LABEL: name: bzero_constant_width
90    ; UNKNOWN: liveins: $x0, $x1
91    ; UNKNOWN-NEXT: {{  $}}
92    ; UNKNOWN-NEXT: %ptr:_(p0) = COPY $x0
93    ; UNKNOWN-NEXT: %zero:_(s8) = G_CONSTANT i8 0
94    ; UNKNOWN-NEXT: %width:_(s64) = G_CONSTANT i64 1024
95    ; UNKNOWN-NEXT: G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
96    ; UNKNOWN-NEXT: RET_ReallyLR
97    %ptr:_(p0) = COPY $x0
98    %zero:_(s8) = G_CONSTANT i8 0
99    %width:_(s64) = G_CONSTANT i64 1024
100    G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
101    RET_ReallyLR
102...
103---
104name:            bzero_constant_width_minsize
105tracksRegLiveness: true
106body:             |
107  bb.0:
108    liveins: $x0, $x1
109    ; With minsize, we should always use G_BZERO to avoid a copy from wzr.
110
111    ; DARWIN-LABEL: name: bzero_constant_width_minsize
112    ; DARWIN: liveins: $x0, $x1
113    ; DARWIN-NEXT: {{  $}}
114    ; DARWIN-NEXT: %ptr:_(p0) = COPY $x0
115    ; DARWIN-NEXT: %width:_(s64) = G_CONSTANT i64 256
116    ; DARWIN-NEXT: G_BZERO %ptr(p0), %width(s64), 0 :: (store (s32))
117    ; DARWIN-NEXT: RET_ReallyLR
118    ;
119    ; UNKNOWN-LABEL: name: bzero_constant_width_minsize
120    ; UNKNOWN: liveins: $x0, $x1
121    ; UNKNOWN-NEXT: {{  $}}
122    ; UNKNOWN-NEXT: %ptr:_(p0) = COPY $x0
123    ; UNKNOWN-NEXT: %zero:_(s8) = G_CONSTANT i8 0
124    ; UNKNOWN-NEXT: %width:_(s64) = G_CONSTANT i64 256
125    ; UNKNOWN-NEXT: G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
126    ; UNKNOWN-NEXT: RET_ReallyLR
127    %ptr:_(p0) = COPY $x0
128    %zero:_(s8) = G_CONSTANT i8 0
129    %width:_(s64) = G_CONSTANT i64 256
130    G_MEMSET %ptr(p0), %zero(s8), %width(s64), 0 :: (store (s32))
131    RET_ReallyLR
132...
133---
134name:            not_zero
135tracksRegLiveness: true
136body:             |
137  bb.0:
138    liveins: $x0, $x1
139    ; When the value isn't 0, don't create G_BZERO.
140
141    ; DARWIN-LABEL: name: not_zero
142    ; DARWIN: liveins: $x0, $x1
143    ; DARWIN-NEXT: {{  $}}
144    ; DARWIN-NEXT: %ptr:_(p0) = COPY $x0
145    ; DARWIN-NEXT: %not_zero:_(s8) = G_CONSTANT i8 1
146    ; DARWIN-NEXT: %width:_(s64) = G_CONSTANT i64 256
147    ; DARWIN-NEXT: G_MEMSET %ptr(p0), %not_zero(s8), %width(s64), 0 :: (store (s32))
148    ; DARWIN-NEXT: RET_ReallyLR
149    ;
150    ; UNKNOWN-LABEL: name: not_zero
151    ; UNKNOWN: liveins: $x0, $x1
152    ; UNKNOWN-NEXT: {{  $}}
153    ; UNKNOWN-NEXT: %ptr:_(p0) = COPY $x0
154    ; UNKNOWN-NEXT: %not_zero:_(s8) = G_CONSTANT i8 1
155    ; UNKNOWN-NEXT: %width:_(s64) = G_CONSTANT i64 256
156    ; UNKNOWN-NEXT: G_MEMSET %ptr(p0), %not_zero(s8), %width(s64), 0 :: (store (s32))
157    ; UNKNOWN-NEXT: RET_ReallyLR
158    %ptr:_(p0) = COPY $x0
159    %not_zero:_(s8) = G_CONSTANT i8 1
160    %width:_(s64) = G_CONSTANT i64 256
161    G_MEMSET %ptr(p0), %not_zero(s8), %width(s64), 0 :: (store (s32))
162    RET_ReallyLR
163