[ARM] Cortex-M4 schedule additions
[llvm-complete.git] / test / CodeGen / Thumb2 / LowOverheadLoops / size-limit.mir
blobacb7ebd35f3fd00ad27713919f9702c7608968bc
1 # RUN: llc -mtriple=armv8.1m.main -run-pass=arm-low-overhead-loops --verify-machineinstrs %s -o - | FileCheck %s
2 # CHECK: entry:
3 # CHECK: $lr = t2DLS
4 # CHECK: for.body:
5 # CHECK: $lr = t2LEUpdate renamable $lr
7 --- |
8   ; ModuleID = 'size-limit.ll'
9   source_filename = "size-limit.ll"
10   target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
11   target triple = "thumbv8.1m.main"
12   
13   define dso_local arm_aapcscc void @size_limit(i32* nocapture %a, i32* nocapture readonly %b, i32* nocapture readonly %c, i32 %N) {
14   entry:
15     %cmp8 = icmp eq i32 %N, 0
16     br i1 %cmp8, label %for.cond.cleanup, label %for.body.preheader
17   
18   for.body.preheader:                               ; preds = %entry
19     %scevgep = getelementptr i32, i32* %a, i32 -1
20     %scevgep4 = getelementptr i32, i32* %c, i32 -1
21     %scevgep8 = getelementptr i32, i32* %b, i32 -1
22     call void @llvm.set.loop.iterations.i32(i32 %N)
23     br label %for.body
24   
25   for.cond.cleanup:                                 ; preds = %for.body, %entry
26     ret void
27   
28   for.body:                                         ; preds = %for.body, %for.body.preheader
29     %lsr.iv9 = phi i32* [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ]
30     %lsr.iv5 = phi i32* [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ]
31     %lsr.iv1 = phi i32* [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ]
32     %0 = phi i32 [ %N, %for.body.preheader ], [ %3, %for.body ]
33     %size = call i32 @llvm.arm.space(i32 4070, i32 undef)
34     %scevgep3 = getelementptr i32, i32* %lsr.iv9, i32 1
35     %1 = load i32, i32* %scevgep3, align 4
36     %scevgep7 = getelementptr i32, i32* %lsr.iv5, i32 1
37     %2 = load i32, i32* %scevgep7, align 4
38     %mul = mul nsw i32 %2, %1
39     %scevgep11 = getelementptr i32, i32* %lsr.iv1, i32 1
40     store i32 %mul, i32* %scevgep11, align 4
41     %scevgep2 = getelementptr i32, i32* %lsr.iv1, i32 1
42     %scevgep6 = getelementptr i32, i32* %lsr.iv5, i32 1
43     %scevgep10 = getelementptr i32, i32* %lsr.iv9, i32 1
44     %3 = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %0, i32 1)
45     %4 = icmp ne i32 %3, 0
46     br i1 %4, label %for.body, label %for.cond.cleanup
47   }
48   
49   ; Function Attrs: nounwind
50   declare i32 @llvm.arm.space(i32 immarg, i32) #0
51   
52   ; Function Attrs: noduplicate nounwind
53   declare void @llvm.set.loop.iterations.i32(i32) #1
54   
55   ; Function Attrs: noduplicate nounwind
56   declare i32 @llvm.loop.decrement.reg.i32.i32.i32(i32, i32) #1
57   
58   ; Function Attrs: nounwind
59   declare void @llvm.stackprotector(i8*, i8**) #0
60   
61   attributes #0 = { nounwind }
62   attributes #1 = { noduplicate nounwind }
64 ...
65 ---
66 name:            size_limit
67 alignment:       2
68 exposesReturnsTwice: false
69 legalized:       false
70 regBankSelected: false
71 selected:        false
72 failedISel:      false
73 tracksRegLiveness: true
74 hasWinCFI:       false
75 registers:       []
76 liveins:
77   - { reg: '$r0', virtual-reg: '' }
78   - { reg: '$r1', virtual-reg: '' }
79   - { reg: '$r2', virtual-reg: '' }
80   - { reg: '$r3', virtual-reg: '' }
81 frameInfo:
82   isFrameAddressTaken: false
83   isReturnAddressTaken: false
84   hasStackMap:     false
85   hasPatchPoint:   false
86   stackSize:       8
87   offsetAdjustment: 0
88   maxAlignment:    4
89   adjustsStack:    false
90   hasCalls:        false
91   stackProtector:  ''
92   maxCallFrameSize: 0
93   cvBytesOfCalleeSavedRegisters: 0
94   hasOpaqueSPAdjustment: false
95   hasVAStart:      false
96   hasMustTailInVarArgFunc: false
97   localFrameSize:  0
98   savePoint:       ''
99   restorePoint:    ''
100 fixedStack:      []
101 stack:
102   - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4, 
103       stack-id: default, callee-saved-register: '$lr', callee-saved-restored: false, 
104       debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
105   - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4, 
106       stack-id: default, callee-saved-register: '$r7', callee-saved-restored: true, 
107       debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
108 callSites:       []
109 constants:       []
110 machineFunctionInfo: {}
111 body:             |
112   bb.0.entry:
113     successors: %bb.1(0x80000000)
114     liveins: $r0, $r1, $r2, $r3, $r7, $lr
115   
116     frame-setup tPUSH 14, $noreg, killed $r7, killed $lr, implicit-def $sp, implicit $sp
117     frame-setup CFI_INSTRUCTION def_cfa_offset 8
118     frame-setup CFI_INSTRUCTION offset $lr, -4
119     frame-setup CFI_INSTRUCTION offset $r7, -8
120     tCMPi8 $r3, 0, 14, $noreg, implicit-def $cpsr
121     t2IT 0, 8, implicit-def $itstate
122     tPOP_RET 0, killed $cpsr, def $r7, def $pc, implicit killed $itstate
123     renamable $r1, dead $cpsr = tSUBi8 killed renamable $r1, 4, 14, $noreg
124     renamable $r2, dead $cpsr = tSUBi8 killed renamable $r2, 4, 14, $noreg
125     renamable $r0, dead $cpsr = tSUBi8 killed renamable $r0, 4, 14, $noreg
126     $lr = tMOVr $r3, 14, $noreg
127     t2DoLoopStart killed $r3
128   
129   bb.1.for.body:
130     successors: %bb.1(0x7c000000), %bb.2(0x04000000)
131     liveins: $lr, $r0, $r1, $r2
132   
133     dead renamable $r3 = SPACE 4070, undef renamable $r0
134     renamable $r12, renamable $r1 = t2LDR_PRE killed renamable $r1, 4, 14, $noreg :: (load 4 from %ir.scevgep3)
135     renamable $r3, renamable $r2 = t2LDR_PRE killed renamable $r2, 4, 14, $noreg :: (load 4 from %ir.scevgep7)
136     renamable $r3 = nsw t2MUL killed renamable $r3, killed renamable $r12, 14, $noreg
137     early-clobber renamable $r0 = t2STR_PRE killed renamable $r3, killed renamable $r0, 4, 14, $noreg :: (store 4 into %ir.scevgep11)
138     renamable $lr = t2LoopDec killed renamable $lr, 1
139     t2LoopEnd renamable $lr, %bb.1, implicit-def dead $cpsr
140     tB %bb.2, 14, $noreg
141   
142   bb.2.for.cond.cleanup:
143     tPOP_RET 14, $noreg, def $r7, def $pc