xref: /llvm-project/llvm/test/CodeGen/MIR/AArch64/mirCanonIdempotent.mir (revision 49510c50200cf58c9f2dedf4e4ab36a16503878e)
1# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -verify-machineinstrs -run-pass mir-canonicalizer %s | FileCheck %s
2# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -mir-vreg-namer-use-stable-hash -verify-machineinstrs -run-pass mir-canonicalizer %s | FileCheck %s
3# These Idempotent instructions are sorted alphabetically (based on after the '=')
4# CHECK: %bb0_{{[0-9a-f]+}}__1:gpr64 = MOVi64imm 4617315517961601024
5# CHECK-NEXT: %bb0_{{[0-9a-f]+}}__1:gpr32 = MOVi32imm 408
6# CHECK-NEXT: %bb0_{{[0-9a-f]+}}__2:gpr32 = MOVi32imm 408
7# CHECK-NEXT: %bb0_{{[0-9a-f]+}}__1:gpr64all = IMPLICIT_DEF
8# CHECK-NEXT: %bb0_{{[0-9a-f]+}}__1:fpr64 = FMOVDi 20
9# CHECK-NEXT: %bb0_{{[0-9a-f]+}}__1:fpr64 = FMOVDi 112
10
11...
12---
13name: Proc8
14stack:
15  - { id: 0, type: default, offset: 0, size: 4, alignment: 4,
16      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
17      local-offset: -4, debug-info-variable: '', debug-info-expression: '',
18      debug-info-location: '' }
19  - { id: 1, type: default, offset: 0, size: 8, alignment: 8,
20      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
21      local-offset: -16, debug-info-variable: '', debug-info-expression: '',
22      debug-info-location: '' }
23  - { id: 2, type: default, offset: 0, size: 8, alignment: 8,
24      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
25      local-offset: -24, debug-info-variable: '', debug-info-expression: '',
26      debug-info-location: '' }
27  - { id: 3, type: default, offset: 0, size: 8, alignment: 8,
28      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
29      local-offset: -32, debug-info-variable: '', debug-info-expression: '',
30      debug-info-location: '' }
31  - { id: 4, type: default, offset: 0, size: 8, alignment: 8,
32      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
33      local-offset: -40, debug-info-variable: '', debug-info-expression: '',
34      debug-info-location: '' }
35  - { id: 5, type: default, offset: 0, size: 8, alignment: 8,
36      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
37      local-offset: -48, debug-info-variable: '', debug-info-expression: '',
38      debug-info-location: '' }
39  - { id: 6, type: default, offset: 0, size: 8, alignment: 8,
40      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
41      local-offset: -56, debug-info-variable: '', debug-info-expression: '',
42      debug-info-location: '' }
43constants:
44body: |
45  bb.0:
46    liveins: $x0, $x1, $d0, $d1
47
48    %3:fpr64 = COPY $d1
49    %2:fpr64 = COPY $d0
50    %1:gpr64 = COPY $x1
51    %0:gpr64common = COPY $x0
52    STRXui %0, %stack.1, 0 :: (store (s64))
53    STRXui %1, %stack.2, 0 :: (store (s64))
54    STRDui %2, %stack.3, 0 :: (store (s64))
55    STRDui %3, %stack.4, 0 :: (store (s64))
56
57    %4:fpr64 = FMOVDi 20
58    %5:fpr64 = FADDDrr %2, killed %4, implicit $fpcr
59    STRDui %5, %stack.5, 0 :: (store (s64))
60
61    %6:gpr32 = FCVTZSUWDr %5, implicit $fpcr
62    STRDroW %3, %0, killed %6, 1, 1
63
64    %7:gpr64common = LDRXui %stack.1, 0 :: (dereferenceable load (s64))
65    %8:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
66
67    %9:gpr32common = FCVTZSUWDr killed %8, implicit $fpcr
68    %10:fpr64 = LDRDroW %7, %9, 1, 1
69
70    %11:gpr32common = ADDWri %9, 1, 0
71    STRDroW killed %10, %7, killed %11, 1, 1
72
73    %12:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
74    %13:gpr64common = LDRXui %stack.1, 0 :: (dereferenceable load (s64))
75
76    %14:gpr32common = FCVTZSUWDr %12, implicit $fpcr
77    %15:gpr32common = ADDWri killed %14, 30, 0
78    STRDroW %12, killed %13, killed %15, 1, 1
79
80    %16:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
81    STRDui killed %16, %stack.6, 0 :: (store (s64))
82
83    %19:fpr64 = FMOVDi 112
84    %46:gpr32 = MOVi32imm 408
85    %43:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
86    %44:gpr64 = LDRXui %stack.2, 0 :: (dereferenceable load (s64))
87
88    %45:gpr32 = FCVTZSUWDr %43, implicit $fpcr
89    %47:gpr64common = SMADDLrrr killed %45, %46, killed %44
90    %48:fpr64 = LDRDui %stack.6, 0 :: (dereferenceable load (s64))
91
92    %49:gpr32 = FCVTZSUWDr killed %48, implicit $fpcr
93    STRDroW %43, killed %47, killed %49, 1, 1
94
95    %21:gpr64 = LDRXui %stack.2, 0 :: (dereferenceable load (s64))
96    %22:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
97
98    %23:gpr32 = FCVTZSUWDr killed %22, implicit $fpcr
99    %24:gpr32 = MOVi32imm 408
100    %25:gpr64common = SMADDLrrr %23, %24, killed %21
101    %26:gpr64sp = ADDXrx killed %25, %23, 51
102    %27:fpr64 = LDURDi %26, -8
103    %29:fpr64 = FADDDrr killed %27, %19, implicit $fpcr
104    STURDi killed %29, %26, -8
105
106    %30:gpr64common = LDRXui %stack.1, 0 :: (dereferenceable load (s64))
107    %31:fpr64 = LDRDui %stack.5, 0 :: (dereferenceable load (s64))
108
109    %32:gpr32common = FCVTZSUWDr killed %31, implicit $fpcr
110    %34:gpr64all = IMPLICIT_DEF
111    %33:gpr64 = INSERT_SUBREG %34, %32, %subreg.sub_32
112    %35:gpr64 = SBFMXri killed %33, 61, 31
113    %36:fpr64 = LDRDroX killed %30, %35, 0, 0
114    %37:gpr64 = LDRXui %stack.2, 0 :: (dereferenceable load (s64))
115
116    %38:gpr32common = ADDWri %32, 20, 0
117    %39:gpr64common = SMADDLrrr killed %38, %24, killed %37
118    STRDroX killed %36, killed %39, %35, 0, 0
119
120    %40:gpr64 = MOVi64imm 4617315517961601024
121
122    %42:gpr32 = LDRWui %stack.0, 0 :: (dereferenceable load (s64))
123    $w0 = COPY %42
124    RET_ReallyLR implicit $w0
125
126...
127