Skip to content

Commit aafdce0

Browse files
petechoumahesh-attarde
authored andcommitted
[GlobalISel] Allow Legalizer to lower volatile memcpy family. (llvm#145997)
This change updates legalizer to allow lowering volatile memcpy family as a target might rely on lowering to legalize them.
1 parent 6777c4e commit aafdce0

File tree

6 files changed

+187
-126
lines changed

6 files changed

+187
-126
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10120,14 +10120,10 @@ LegalizerHelper::lowerMemCpyFamily(MachineInstr &MI, unsigned MaxLen) {
1012010120
return Legalized;
1012110121
}
1012210122

10123-
bool IsVolatile = MemOp->isVolatile();
10124-
// Don't try to optimize volatile.
10125-
if (IsVolatile)
10126-
return UnableToLegalize;
10127-
1012810123
if (MaxLen && KnownLen > MaxLen)
1012910124
return UnableToLegalize;
1013010125

10126+
bool IsVolatile = MemOp->isVolatile();
1013110127
if (Opc == TargetOpcode::G_MEMCPY) {
1013210128
auto &MF = *MI.getParent()->getParent();
1013310129
const auto &TLI = *MF.getSubtarget().getTargetLowering();

llvm/test/CodeGen/AArch64/aarch64-mops.ll

Lines changed: 67 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -87,46 +87,17 @@ entry:
8787
}
8888

8989
define void @memset_10_zeroval_volatile(ptr %dst) {
90-
; GISel-WITHOUT-MOPS-O0-LABEL: memset_10_zeroval_volatile:
91-
; GISel-WITHOUT-MOPS-O0: // %bb.0: // %entry
92-
; GISel-WITHOUT-MOPS-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
93-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_def_cfa_offset 16
94-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_offset w30, -16
95-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w8, #10 // =0xa
96-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w2, w8
97-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w1, wzr
98-
; GISel-WITHOUT-MOPS-O0-NEXT: bl memset
99-
; GISel-WITHOUT-MOPS-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
100-
; GISel-WITHOUT-MOPS-O0-NEXT: ret
101-
;
102-
; GISel-WITHOUT-MOPS-O3-LABEL: memset_10_zeroval_volatile:
103-
; GISel-WITHOUT-MOPS-O3: // %bb.0: // %entry
104-
; GISel-WITHOUT-MOPS-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
105-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_def_cfa_offset 16
106-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_offset w30, -16
107-
; GISel-WITHOUT-MOPS-O3-NEXT: mov w1, wzr
108-
; GISel-WITHOUT-MOPS-O3-NEXT: mov w2, #10 // =0xa
109-
; GISel-WITHOUT-MOPS-O3-NEXT: bl memset
110-
; GISel-WITHOUT-MOPS-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
111-
; GISel-WITHOUT-MOPS-O3-NEXT: ret
112-
;
113-
; GISel-MOPS-O0-LABEL: memset_10_zeroval_volatile:
114-
; GISel-MOPS-O0: // %bb.0: // %entry
115-
; GISel-MOPS-O0-NEXT: mov w8, #10 // =0xa
116-
; GISel-MOPS-O0-NEXT: // kill: def $x8 killed $w8
117-
; GISel-MOPS-O0-NEXT: mov x9, xzr
118-
; GISel-MOPS-O0-NEXT: setp [x0]!, x8!, x9
119-
; GISel-MOPS-O0-NEXT: setm [x0]!, x8!, x9
120-
; GISel-MOPS-O0-NEXT: sete [x0]!, x8!, x9
121-
; GISel-MOPS-O0-NEXT: ret
90+
; GISel-WITHOUT-MOPS-LABEL: memset_10_zeroval_volatile:
91+
; GISel-WITHOUT-MOPS: // %bb.0: // %entry
92+
; GISel-WITHOUT-MOPS-NEXT: str xzr, [x0]
93+
; GISel-WITHOUT-MOPS-NEXT: strh wzr, [x0, #8]
94+
; GISel-WITHOUT-MOPS-NEXT: ret
12295
;
123-
; GISel-MOPS-O3-LABEL: memset_10_zeroval_volatile:
124-
; GISel-MOPS-O3: // %bb.0: // %entry
125-
; GISel-MOPS-O3-NEXT: mov w8, #10 // =0xa
126-
; GISel-MOPS-O3-NEXT: setp [x0]!, x8!, xzr
127-
; GISel-MOPS-O3-NEXT: setm [x0]!, x8!, xzr
128-
; GISel-MOPS-O3-NEXT: sete [x0]!, x8!, xzr
129-
; GISel-MOPS-O3-NEXT: ret
96+
; GISel-MOPS-LABEL: memset_10_zeroval_volatile:
97+
; GISel-MOPS: // %bb.0: // %entry
98+
; GISel-MOPS-NEXT: str xzr, [x0]
99+
; GISel-MOPS-NEXT: strh wzr, [x0, #8]
100+
; GISel-MOPS-NEXT: ret
130101
;
131102
; SDAG-WITHOUT-MOPS-O2-LABEL: memset_10_zeroval_volatile:
132103
; SDAG-WITHOUT-MOPS-O2: // %bb.0: // %entry
@@ -490,43 +461,46 @@ entry:
490461
define void @memset_10_volatile(ptr %dst, i32 %value) {
491462
; GISel-WITHOUT-MOPS-O0-LABEL: memset_10_volatile:
492463
; GISel-WITHOUT-MOPS-O0: // %bb.0: // %entry
493-
; GISel-WITHOUT-MOPS-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
494-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_def_cfa_offset 16
495-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_offset w30, -16
496-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w8, #10 // =0xa
497-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w2, w8
498-
; GISel-WITHOUT-MOPS-O0-NEXT: bl memset
499-
; GISel-WITHOUT-MOPS-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
464+
; GISel-WITHOUT-MOPS-O0-NEXT: // implicit-def: $x8
465+
; GISel-WITHOUT-MOPS-O0-NEXT: mov w8, w1
466+
; GISel-WITHOUT-MOPS-O0-NEXT: and x8, x8, #0xff
467+
; GISel-WITHOUT-MOPS-O0-NEXT: mov x9, #72340172838076673 // =0x101010101010101
468+
; GISel-WITHOUT-MOPS-O0-NEXT: mul x8, x8, x9
469+
; GISel-WITHOUT-MOPS-O0-NEXT: str x8, [x0]
470+
; GISel-WITHOUT-MOPS-O0-NEXT: // kill: def $w8 killed $w8 killed $x8
471+
; GISel-WITHOUT-MOPS-O0-NEXT: strh w8, [x0, #8]
500472
; GISel-WITHOUT-MOPS-O0-NEXT: ret
501473
;
502474
; GISel-WITHOUT-MOPS-O3-LABEL: memset_10_volatile:
503475
; GISel-WITHOUT-MOPS-O3: // %bb.0: // %entry
504-
; GISel-WITHOUT-MOPS-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
505-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_def_cfa_offset 16
506-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_offset w30, -16
507-
; GISel-WITHOUT-MOPS-O3-NEXT: mov w2, #10 // =0xa
508-
; GISel-WITHOUT-MOPS-O3-NEXT: bl memset
509-
; GISel-WITHOUT-MOPS-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
476+
; GISel-WITHOUT-MOPS-O3-NEXT: // kill: def $w1 killed $w1 def $x1
477+
; GISel-WITHOUT-MOPS-O3-NEXT: mov x8, #72340172838076673 // =0x101010101010101
478+
; GISel-WITHOUT-MOPS-O3-NEXT: and x9, x1, #0xff
479+
; GISel-WITHOUT-MOPS-O3-NEXT: mul x8, x9, x8
480+
; GISel-WITHOUT-MOPS-O3-NEXT: str x8, [x0]
481+
; GISel-WITHOUT-MOPS-O3-NEXT: strh w8, [x0, #8]
510482
; GISel-WITHOUT-MOPS-O3-NEXT: ret
511483
;
512484
; GISel-MOPS-O0-LABEL: memset_10_volatile:
513485
; GISel-MOPS-O0: // %bb.0: // %entry
514-
; GISel-MOPS-O0-NEXT: mov w8, #10 // =0xa
515-
; GISel-MOPS-O0-NEXT: // kill: def $x8 killed $w8
516-
; GISel-MOPS-O0-NEXT: // implicit-def: $x9
517-
; GISel-MOPS-O0-NEXT: mov w9, w1
518-
; GISel-MOPS-O0-NEXT: setp [x0]!, x8!, x9
519-
; GISel-MOPS-O0-NEXT: setm [x0]!, x8!, x9
520-
; GISel-MOPS-O0-NEXT: sete [x0]!, x8!, x9
486+
; GISel-MOPS-O0-NEXT: // implicit-def: $x8
487+
; GISel-MOPS-O0-NEXT: mov w8, w1
488+
; GISel-MOPS-O0-NEXT: and x8, x8, #0xff
489+
; GISel-MOPS-O0-NEXT: mov x9, #72340172838076673 // =0x101010101010101
490+
; GISel-MOPS-O0-NEXT: mul x8, x8, x9
491+
; GISel-MOPS-O0-NEXT: str x8, [x0]
492+
; GISel-MOPS-O0-NEXT: // kill: def $w8 killed $w8 killed $x8
493+
; GISel-MOPS-O0-NEXT: strh w8, [x0, #8]
521494
; GISel-MOPS-O0-NEXT: ret
522495
;
523496
; GISel-MOPS-O3-LABEL: memset_10_volatile:
524497
; GISel-MOPS-O3: // %bb.0: // %entry
525-
; GISel-MOPS-O3-NEXT: mov w8, #10 // =0xa
526498
; GISel-MOPS-O3-NEXT: // kill: def $w1 killed $w1 def $x1
527-
; GISel-MOPS-O3-NEXT: setp [x0]!, x8!, x1
528-
; GISel-MOPS-O3-NEXT: setm [x0]!, x8!, x1
529-
; GISel-MOPS-O3-NEXT: sete [x0]!, x8!, x1
499+
; GISel-MOPS-O3-NEXT: mov x8, #72340172838076673 // =0x101010101010101
500+
; GISel-MOPS-O3-NEXT: and x9, x1, #0xff
501+
; GISel-MOPS-O3-NEXT: mul x8, x9, x8
502+
; GISel-MOPS-O3-NEXT: str x8, [x0]
503+
; GISel-MOPS-O3-NEXT: strh w8, [x0, #8]
530504
; GISel-MOPS-O3-NEXT: ret
531505
;
532506
; SDAG-WITHOUT-MOPS-O2-LABEL: memset_10_volatile:
@@ -905,43 +879,21 @@ entry:
905879
}
906880

907881
define void @memcpy_10_volatile(ptr %dst, ptr %src, i32 %value) {
908-
; GISel-WITHOUT-MOPS-O0-LABEL: memcpy_10_volatile:
909-
; GISel-WITHOUT-MOPS-O0: // %bb.0: // %entry
910-
; GISel-WITHOUT-MOPS-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
911-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_def_cfa_offset 16
912-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_offset w30, -16
913-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w8, #10 // =0xa
914-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w2, w8
915-
; GISel-WITHOUT-MOPS-O0-NEXT: bl memcpy
916-
; GISel-WITHOUT-MOPS-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
917-
; GISel-WITHOUT-MOPS-O0-NEXT: ret
918-
;
919-
; GISel-WITHOUT-MOPS-O3-LABEL: memcpy_10_volatile:
920-
; GISel-WITHOUT-MOPS-O3: // %bb.0: // %entry
921-
; GISel-WITHOUT-MOPS-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
922-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_def_cfa_offset 16
923-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_offset w30, -16
924-
; GISel-WITHOUT-MOPS-O3-NEXT: mov w2, #10 // =0xa
925-
; GISel-WITHOUT-MOPS-O3-NEXT: bl memcpy
926-
; GISel-WITHOUT-MOPS-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
927-
; GISel-WITHOUT-MOPS-O3-NEXT: ret
928-
;
929-
; GISel-MOPS-O0-LABEL: memcpy_10_volatile:
930-
; GISel-MOPS-O0: // %bb.0: // %entry
931-
; GISel-MOPS-O0-NEXT: mov w8, #10 // =0xa
932-
; GISel-MOPS-O0-NEXT: // kill: def $x8 killed $w8
933-
; GISel-MOPS-O0-NEXT: cpyfp [x0]!, [x1]!, x8!
934-
; GISel-MOPS-O0-NEXT: cpyfm [x0]!, [x1]!, x8!
935-
; GISel-MOPS-O0-NEXT: cpyfe [x0]!, [x1]!, x8!
936-
; GISel-MOPS-O0-NEXT: ret
882+
; GISel-WITHOUT-MOPS-LABEL: memcpy_10_volatile:
883+
; GISel-WITHOUT-MOPS: // %bb.0: // %entry
884+
; GISel-WITHOUT-MOPS-NEXT: ldr x8, [x1]
885+
; GISel-WITHOUT-MOPS-NEXT: str x8, [x0]
886+
; GISel-WITHOUT-MOPS-NEXT: ldrh w8, [x1, #8]
887+
; GISel-WITHOUT-MOPS-NEXT: strh w8, [x0, #8]
888+
; GISel-WITHOUT-MOPS-NEXT: ret
937889
;
938-
; GISel-MOPS-O3-LABEL: memcpy_10_volatile:
939-
; GISel-MOPS-O3: // %bb.0: // %entry
940-
; GISel-MOPS-O3-NEXT: mov w8, #10 // =0xa
941-
; GISel-MOPS-O3-NEXT: cpyfp [x0]!, [x1]!, x8!
942-
; GISel-MOPS-O3-NEXT: cpyfm [x0]!, [x1]!, x8!
943-
; GISel-MOPS-O3-NEXT: cpyfe [x0]!, [x1]!, x8!
944-
; GISel-MOPS-O3-NEXT: ret
890+
; GISel-MOPS-LABEL: memcpy_10_volatile:
891+
; GISel-MOPS: // %bb.0: // %entry
892+
; GISel-MOPS-NEXT: ldr x8, [x1]
893+
; GISel-MOPS-NEXT: str x8, [x0]
894+
; GISel-MOPS-NEXT: ldrh w8, [x1, #8]
895+
; GISel-MOPS-NEXT: strh w8, [x0, #8]
896+
; GISel-MOPS-NEXT: ret
945897
;
946898
; SDAG-WITHOUT-MOPS-O2-LABEL: memcpy_10_volatile:
947899
; SDAG-WITHOUT-MOPS-O2: // %bb.0: // %entry
@@ -1736,40 +1688,34 @@ entry:
17361688
define void @memmove_10_volatile(ptr %dst, ptr %src, i32 %value) {
17371689
; GISel-WITHOUT-MOPS-O0-LABEL: memmove_10_volatile:
17381690
; GISel-WITHOUT-MOPS-O0: // %bb.0: // %entry
1739-
; GISel-WITHOUT-MOPS-O0-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1740-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_def_cfa_offset 16
1741-
; GISel-WITHOUT-MOPS-O0-NEXT: .cfi_offset w30, -16
1742-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w8, #10 // =0xa
1743-
; GISel-WITHOUT-MOPS-O0-NEXT: mov w2, w8
1744-
; GISel-WITHOUT-MOPS-O0-NEXT: bl memmove
1745-
; GISel-WITHOUT-MOPS-O0-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
1691+
; GISel-WITHOUT-MOPS-O0-NEXT: ldr x9, [x1]
1692+
; GISel-WITHOUT-MOPS-O0-NEXT: ldrh w8, [x1, #8]
1693+
; GISel-WITHOUT-MOPS-O0-NEXT: str x9, [x0]
1694+
; GISel-WITHOUT-MOPS-O0-NEXT: strh w8, [x0, #8]
17461695
; GISel-WITHOUT-MOPS-O0-NEXT: ret
17471696
;
17481697
; GISel-WITHOUT-MOPS-O3-LABEL: memmove_10_volatile:
17491698
; GISel-WITHOUT-MOPS-O3: // %bb.0: // %entry
1750-
; GISel-WITHOUT-MOPS-O3-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
1751-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_def_cfa_offset 16
1752-
; GISel-WITHOUT-MOPS-O3-NEXT: .cfi_offset w30, -16
1753-
; GISel-WITHOUT-MOPS-O3-NEXT: mov w2, #10 // =0xa
1754-
; GISel-WITHOUT-MOPS-O3-NEXT: bl memmove
1755-
; GISel-WITHOUT-MOPS-O3-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
1699+
; GISel-WITHOUT-MOPS-O3-NEXT: ldr x8, [x1]
1700+
; GISel-WITHOUT-MOPS-O3-NEXT: ldrh w9, [x1, #8]
1701+
; GISel-WITHOUT-MOPS-O3-NEXT: str x8, [x0]
1702+
; GISel-WITHOUT-MOPS-O3-NEXT: strh w9, [x0, #8]
17561703
; GISel-WITHOUT-MOPS-O3-NEXT: ret
17571704
;
17581705
; GISel-MOPS-O0-LABEL: memmove_10_volatile:
17591706
; GISel-MOPS-O0: // %bb.0: // %entry
1760-
; GISel-MOPS-O0-NEXT: mov w8, #10 // =0xa
1761-
; GISel-MOPS-O0-NEXT: // kill: def $x8 killed $w8
1762-
; GISel-MOPS-O0-NEXT: cpyp [x0]!, [x1]!, x8!
1763-
; GISel-MOPS-O0-NEXT: cpym [x0]!, [x1]!, x8!
1764-
; GISel-MOPS-O0-NEXT: cpye [x0]!, [x1]!, x8!
1707+
; GISel-MOPS-O0-NEXT: ldr x9, [x1]
1708+
; GISel-MOPS-O0-NEXT: ldrh w8, [x1, #8]
1709+
; GISel-MOPS-O0-NEXT: str x9, [x0]
1710+
; GISel-MOPS-O0-NEXT: strh w8, [x0, #8]
17651711
; GISel-MOPS-O0-NEXT: ret
17661712
;
17671713
; GISel-MOPS-O3-LABEL: memmove_10_volatile:
17681714
; GISel-MOPS-O3: // %bb.0: // %entry
1769-
; GISel-MOPS-O3-NEXT: mov w8, #10 // =0xa
1770-
; GISel-MOPS-O3-NEXT: cpyp [x0]!, [x1]!, x8!
1771-
; GISel-MOPS-O3-NEXT: cpym [x0]!, [x1]!, x8!
1772-
; GISel-MOPS-O3-NEXT: cpye [x0]!, [x1]!, x8!
1715+
; GISel-MOPS-O3-NEXT: ldr x8, [x1]
1716+
; GISel-MOPS-O3-NEXT: ldrh w9, [x1, #8]
1717+
; GISel-MOPS-O3-NEXT: str x8, [x0]
1718+
; GISel-MOPS-O3-NEXT: strh w9, [x0, #8]
17731719
; GISel-MOPS-O3-NEXT: ret
17741720
;
17751721
; SDAG-WITHOUT-MOPS-O2-LABEL: memmove_10_volatile:

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-memcpy.mir

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,33 @@ body: |
3131
S_ENDPGM 0
3232
3333
...
34+
---
35+
name: memcpy_test_volatile
36+
body: |
37+
bb.0:
38+
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
39+
40+
; CHECK-LABEL: name: memcpy_test_volatile
41+
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
44+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
45+
; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
46+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
47+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
48+
; CHECK-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
49+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[MV1]](p0) :: (volatile load (s8))
50+
; CHECK-NEXT: G_STORE [[LOAD]](s32), [[MV]](p0) :: (volatile store (s8))
51+
; CHECK-NEXT: S_ENDPGM 0
52+
%0:_(s32) = COPY $vgpr0
53+
%1:_(s32) = COPY $vgpr1
54+
%2:_(p0) = G_MERGE_VALUES %0:_(s32), %1:_(s32)
55+
%3:_(s32) = COPY $vgpr2
56+
%4:_(s32) = COPY $vgpr3
57+
%5:_(p0) = G_MERGE_VALUES %3:_(s32), %4:_(s32)
58+
%6:_(s32) = G_CONSTANT i32 1
59+
%7:_(s64) = G_ZEXT %6:_(s32)
60+
G_MEMCPY %2:_(p0), %5:_(p0), %7:_(s64), 0 :: (volatile store (s8)), (volatile load (s8))
61+
S_ENDPGM 0
62+
63+
...

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-memcpyinline.mir

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,33 @@ body: |
3131
S_ENDPGM 0
3232
3333
...
34+
---
35+
name: memcpyinline_test_volatile
36+
body: |
37+
bb.0:
38+
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
39+
40+
; CHECK-LABEL: name: memcpyinline_test_volatile
41+
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
44+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
45+
; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
46+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
47+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
48+
; CHECK-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
49+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[MV1]](p0) :: (volatile load (s8))
50+
; CHECK-NEXT: G_STORE [[LOAD]](s32), [[MV]](p0) :: (volatile store (s8))
51+
; CHECK-NEXT: S_ENDPGM 0
52+
%0:_(s32) = COPY $vgpr0
53+
%1:_(s32) = COPY $vgpr1
54+
%2:_(p0) = G_MERGE_VALUES %0:_(s32), %1:_(s32)
55+
%3:_(s32) = COPY $vgpr2
56+
%4:_(s32) = COPY $vgpr3
57+
%5:_(p0) = G_MERGE_VALUES %3:_(s32), %4:_(s32)
58+
%6:_(s32) = G_CONSTANT i32 1
59+
%7:_(s64) = G_ZEXT %6:_(s32)
60+
G_MEMCPY_INLINE %2:_(p0), %5:_(p0), %7:_(s64) :: (volatile store (s8)), (volatile load (s8))
61+
S_ENDPGM 0
62+
63+
...

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-memmove.mir

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,33 @@ body: |
3131
S_ENDPGM 0
3232
3333
...
34+
---
35+
name: memmove_test_volatile
36+
body: |
37+
bb.0:
38+
liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
39+
40+
; CHECK-LABEL: name: memmove_test_volatile
41+
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
44+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
45+
; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
46+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
47+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
48+
; CHECK-NEXT: [[MV1:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
49+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[MV1]](p0) :: (volatile load (s8))
50+
; CHECK-NEXT: G_STORE [[LOAD]](s32), [[MV]](p0) :: (volatile store (s8))
51+
; CHECK-NEXT: S_ENDPGM 0
52+
%0:_(s32) = COPY $vgpr0
53+
%1:_(s32) = COPY $vgpr1
54+
%2:_(p0) = G_MERGE_VALUES %0:_(s32), %1:_(s32)
55+
%3:_(s32) = COPY $vgpr2
56+
%4:_(s32) = COPY $vgpr3
57+
%5:_(p0) = G_MERGE_VALUES %3:_(s32), %4:_(s32)
58+
%6:_(s32) = G_CONSTANT i32 1
59+
%7:_(s64) = G_ZEXT %6:_(s32)
60+
G_MEMMOVE %2:_(p0), %5:_(p0), %7:_(s64), 0 :: (volatile store (s8)), (volatile load (s8))
61+
S_ENDPGM 0
62+
63+
...

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-memset.mir

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,32 @@ body: |
3030
S_ENDPGM 0
3131
3232
...
33+
---
34+
name: memset_test_volatile
35+
body: |
36+
bb.0:
37+
liveins: $vgpr0, $vgpr1, $vgpr2
38+
39+
; CHECK-LABEL: name: memset_test_volatile
40+
; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
43+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
44+
; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
45+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
46+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY2]](s32)
47+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s8) = COPY [[TRUNC]](s8)
48+
; CHECK-NEXT: G_STORE [[COPY2]](s32), [[MV]](p0) :: (volatile store (s8))
49+
; CHECK-NEXT: S_ENDPGM 0
50+
%0:_(s32) = COPY $vgpr0
51+
%1:_(s32) = COPY $vgpr1
52+
%2:_(p0) = G_MERGE_VALUES %0:_(s32), %1:_(s32)
53+
%3:_(s32) = COPY $vgpr2
54+
%4:_(s16) = G_TRUNC %3:_(s32)
55+
%5:_(s8) = G_TRUNC %4:_(s16)
56+
%6:_(s32) = G_CONSTANT i32 1
57+
%7:_(s64) = G_ZEXT %6:_(s32)
58+
G_MEMSET %2:_(p0), %5:_(s8), %7:_(s64), 0 :: (volatile store (s8))
59+
S_ENDPGM 0
60+
61+
...

0 commit comments

Comments
 (0)