xref: /llvm-project/llvm/test/CodeGen/PowerPC/ctrloop-do-not-duplicate-mi.mir (revision 60442f0d442723a487528bdd8b48b24657a025e8)
1710923cdSTing Wang# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu \
2f908cbc3STing Wang# RUN:   -run-pass=early-tailduplication,ppc-ctrloops %s -o - -verify-machineinstrs 2>&1 | FileCheck %s
3f908cbc3STing Wang
4f908cbc3STing Wang--- |
5f908cbc3STing Wang  target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
6f908cbc3STing Wang  target triple = "powerpc64le-unknown-linux-gnu"
7f908cbc3STing Wang
8f908cbc3STing Wang  define dso_local void @test() local_unnamed_addr #0 {
9f908cbc3STing Wang  test_entry:
10*60442f0dSNikita Popov    %_val_domain_ = load i32, ptr undef, align 4
11f908cbc3STing Wang    %_conv765 = sext i32 %_val_domain_ to i64
12f908cbc3STing Wang    br i1 undef, label %_label_42, label %_loop_40_loopHeader_
13f908cbc3STing Wang
14f908cbc3STing Wang  _loop_40_loopHeader_:                             ; preds = %test_entry
15*60442f0dSNikita Popov    %_val_flags_1020 = load i32, ptr undef, align 4
16f908cbc3STing Wang    %0 = and i32 %_val_flags_1020, 1
17f908cbc3STing Wang    %_cond_conv_1022.not = icmp eq i32 %0, 0
18f908cbc3STing Wang    %1 = sub i64 1, %_conv765
19f908cbc3STing Wang    %smax = call i64 @llvm.smax.i64(i64 %1, i64 1)
20f908cbc3STing Wang    br label %_label_43
21f908cbc3STing Wang
22f908cbc3STing Wang  _label_43.loopexit:                               ; preds = %_loop_44_loopHeader_
23f908cbc3STing Wang    %lsr.iv.next = add i64 %lsr.iv, -1
24f908cbc3STing Wang    br label %_label_43
25f908cbc3STing Wang
26f908cbc3STing Wang  _label_43:                                        ; preds = %_label_43.loopexit, %_loop_40_loopHeader_
27f908cbc3STing Wang    %lsr.iv = phi i64 [ %lsr.iv.next, %_label_43.loopexit ], [ undef, %_loop_40_loopHeader_ ]
28f908cbc3STing Wang    call void @llvm.set.loop.iterations.i64(i64 %smax)
29f908cbc3STing Wang    br label %_loop_44_do_
30f908cbc3STing Wang
31f908cbc3STing Wang  _loop_44_loopHeader_:                             ; preds = %_loop_44_do_
32f908cbc3STing Wang    %2 = call i1 @llvm.loop.decrement.i64(i64 1)
33f908cbc3STing Wang    br i1 %2, label %_loop_44_do_, label %_label_43.loopexit
34f908cbc3STing Wang
35f908cbc3STing Wang  _loop_44_do_:                                     ; preds = %_loop_44_loopHeader_, %_label_43
36f908cbc3STing Wang    br i1 %_cond_conv_1022.not, label %_label_42.loopexit, label %_loop_44_loopHeader_
37f908cbc3STing Wang
38f908cbc3STing Wang  _label_42.loopexit:                               ; preds = %_loop_44_do_
39f908cbc3STing Wang    %3 = trunc i64 %lsr.iv to i32
40*60442f0dSNikita Popov    store i32 %3, ptr undef, align 4
41f908cbc3STing Wang    unreachable
42f908cbc3STing Wang
43f908cbc3STing Wang  _label_42:                                        ; preds = %test_entry
44f908cbc3STing Wang    unreachable
45f908cbc3STing Wang  }
46f908cbc3STing Wang
47f908cbc3STing Wang  ; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
48f908cbc3STing Wang  declare i64 @llvm.smax.i64(i64, i64) #1
49f908cbc3STing Wang
50f908cbc3STing Wang  ; Function Attrs: nocallback noduplicate nofree nosync nounwind willreturn
51f908cbc3STing Wang  declare void @llvm.set.loop.iterations.i64(i64) #2
52f908cbc3STing Wang
53f908cbc3STing Wang  ; Function Attrs: nocallback noduplicate nofree nosync nounwind willreturn
54f908cbc3STing Wang  declare i1 @llvm.loop.decrement.i64(i64) #2
55f908cbc3STing Wang
56f908cbc3STing Wang  attributes #0 = { "unsafe-fp-math"="true" }
57f908cbc3STing Wang  attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willreturn }
58f908cbc3STing Wang  attributes #2 = { nocallback noduplicate nofree nosync nounwind willreturn }
59f908cbc3STing Wang
60f908cbc3STing Wang  !llvm.ident = !{!0}
61f908cbc3STing Wang
62f908cbc3STing Wang  !0 = !{!""}
63f908cbc3STing Wang
64f908cbc3STing Wang...
65f908cbc3STing Wang---
66f908cbc3STing Wangname:            test
67710923cdSTing Wang# CHECK: test
68f908cbc3STing Wangalignment:       16
69f908cbc3STing WangexposesReturnsTwice: false
70f908cbc3STing Wanglegalized:       false
71f908cbc3STing WangregBankSelected: false
72f908cbc3STing Wangselected:        false
73f908cbc3STing WangfailedISel:      false
74f908cbc3STing WangtracksRegLiveness: true
75f908cbc3STing WanghasWinCFI:       false
76f908cbc3STing WangcallsEHReturn:   false
77f908cbc3STing WangcallsUnwindInit: false
78f908cbc3STing WanghasEHCatchret:   false
79f908cbc3STing WanghasEHScopes:     false
80f908cbc3STing WanghasEHFunclets:   false
81f908cbc3STing WangfailsVerification: false
82f908cbc3STing WangtracksDebugUserValues: false
83f908cbc3STing Wangregisters:
84f908cbc3STing Wang  - { id: 0, class: g8rc, preferred-register: '' }
85f908cbc3STing Wang  - { id: 1, class: crbitrc, preferred-register: '' }
86f908cbc3STing Wang  - { id: 2, class: g8rc, preferred-register: '' }
87f908cbc3STing Wang  - { id: 3, class: g8rc, preferred-register: '' }
88f908cbc3STing Wang  - { id: 4, class: g8rc_and_g8rc_nox0, preferred-register: '' }
89f908cbc3STing Wang  - { id: 5, class: g8rc_and_g8rc_nox0, preferred-register: '' }
90f908cbc3STing Wang  - { id: 6, class: crbitrc, preferred-register: '' }
91f908cbc3STing Wang  - { id: 7, class: g8rc, preferred-register: '' }
92f908cbc3STing Wang  - { id: 8, class: gprc, preferred-register: '' }
93f908cbc3STing Wang  - { id: 9, class: g8rc_and_g8rc_nox0, preferred-register: '' }
94f908cbc3STing Wang  - { id: 10, class: g8rc_and_g8rc_nox0, preferred-register: '' }
95f908cbc3STing Wang  - { id: 11, class: crrc, preferred-register: '' }
96f908cbc3STing Wang  - { id: 12, class: g8rc_and_g8rc_nox0, preferred-register: '' }
97f908cbc3STing Wang  - { id: 13, class: crbitrc, preferred-register: '' }
98f908cbc3STing Wang  - { id: 14, class: g8rc_and_g8rc_nox0, preferred-register: '' }
99f908cbc3STing Wang  - { id: 15, class: gprc, preferred-register: '' }
100f908cbc3STing Wangliveins:         []
101f908cbc3STing WangframeInfo:
102f908cbc3STing Wang  isFrameAddressTaken: false
103f908cbc3STing Wang  isReturnAddressTaken: false
104f908cbc3STing Wang  hasStackMap:     false
105f908cbc3STing Wang  hasPatchPoint:   false
106f908cbc3STing Wang  stackSize:       0
107f908cbc3STing Wang  offsetAdjustment: 0
108f908cbc3STing Wang  maxAlignment:    1
109f908cbc3STing Wang  adjustsStack:    false
110f908cbc3STing Wang  hasCalls:        false
111f908cbc3STing Wang  stackProtector:  ''
112f908cbc3STing Wang  functionContext: ''
113f908cbc3STing Wang  maxCallFrameSize: 4294967295
114f908cbc3STing Wang  cvBytesOfCalleeSavedRegisters: 0
115f908cbc3STing Wang  hasOpaqueSPAdjustment: false
116f908cbc3STing Wang  hasVAStart:      false
117f908cbc3STing Wang  hasMustTailInVarArgFunc: false
118f908cbc3STing Wang  hasTailCall:     false
119f908cbc3STing Wang  localFrameSize:  0
120f908cbc3STing Wang  savePoint:       ''
121f908cbc3STing Wang  restorePoint:    ''
122f908cbc3STing WangfixedStack:      []
123f908cbc3STing Wangstack:           []
124f908cbc3STing WangcallSites:       []
125f908cbc3STing WangdebugValueSubstitutions: []
126f908cbc3STing Wangconstants:       []
127f908cbc3STing WangmachineFunctionInfo: {}
128f908cbc3STing Wangbody:             |
129f908cbc3STing Wang  bb.0.test_entry:
130f908cbc3STing Wang    successors: %bb.7(0x40000000), %bb.1(0x40000000)
131f908cbc3STing Wang
132f908cbc3STing Wang    %5:g8rc_and_g8rc_nox0 = IMPLICIT_DEF
133*60442f0dSNikita Popov    %0:g8rc = LWA 0, killed %5 :: (load (s32) from `ptr undef`)
134f908cbc3STing Wang    %6:crbitrc = IMPLICIT_DEF
135f908cbc3STing Wang    BC killed %6, %bb.7
136f908cbc3STing Wang    B %bb.1
137f908cbc3STing Wang
138f908cbc3STing Wang  bb.1._loop_40_loopHeader_:
139f908cbc3STing Wang    successors: %bb.3(0x80000000)
140f908cbc3STing Wang
141f908cbc3STing Wang    %9:g8rc_and_g8rc_nox0 = IMPLICIT_DEF
142*60442f0dSNikita Popov    %8:gprc = LWZ 0, %9 :: (load (s32) from `ptr undef`)
143f908cbc3STing Wang    %15:gprc = ANDI_rec %8, 1, implicit-def $cr0
144f908cbc3STing Wang    %1:crbitrc = COPY $cr0eq
145f908cbc3STing Wang    %10:g8rc_and_g8rc_nox0 = SUBFIC8 %0, 1, implicit-def dead $carry
146f908cbc3STing Wang    %11:crrc = CMPDI %10, 1
147f908cbc3STing Wang    %12:g8rc_and_g8rc_nox0 = LI8 1
148f908cbc3STing Wang    %2:g8rc = ISEL8 %10, %12, %11.sub_gt
149f908cbc3STing Wang    %7:g8rc = IMPLICIT_DEF
150f908cbc3STing Wang    B %bb.3
151f908cbc3STing Wang
152f908cbc3STing Wang  bb.2._label_43.loopexit:
153f908cbc3STing Wang    successors: %bb.3(0x80000000)
154f908cbc3STing Wang
155f908cbc3STing Wang    %3:g8rc = ADDI8 %4, -1
156f908cbc3STing Wang
157f908cbc3STing Wang  bb.3._label_43:
158f908cbc3STing Wang    successors: %bb.5(0x80000000)
159f908cbc3STing Wang
160f908cbc3STing Wang    %4:g8rc_and_g8rc_nox0 = PHI %7, %bb.1, %3, %bb.2
161f908cbc3STing Wang    MTCTR8loop %2, implicit-def dead $ctr8
162f908cbc3STing Wang    B %bb.5
163f908cbc3STing Wang
164f908cbc3STing Wang  bb.4._loop_44_loopHeader_:
165f908cbc3STing Wang    successors: %bb.5(0x7c000000), %bb.2(0x04000000)
166f908cbc3STing Wang
167f908cbc3STing Wang    %13:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8
168f908cbc3STing Wang    BCn killed %13, %bb.2
169f908cbc3STing Wang    B %bb.5
170f908cbc3STing Wang
171f908cbc3STing Wang  bb.5._loop_44_do_:
172f908cbc3STing Wang    successors: %bb.6(0x00000000), %bb.4(0x80000000)
173f908cbc3STing Wang
174f908cbc3STing Wang    BCn %1, %bb.4
175f908cbc3STing Wang    B %bb.6
176f908cbc3STing Wang
177f908cbc3STing Wang  bb.6._label_42.loopexit:
178f908cbc3STing Wang    successors:
179f908cbc3STing Wang
180f908cbc3STing Wang    %14:g8rc_and_g8rc_nox0 = IMPLICIT_DEF
181*60442f0dSNikita Popov    STW8 %4, 0, killed %14 :: (store (s32) into `ptr undef`)
182f908cbc3STing Wang
183f908cbc3STing Wang  bb.7._label_42:
184f908cbc3STing Wang
185f908cbc3STing Wang...
186