144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# Test normal conditional branches in cases where the sheer number of
244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# instructions causes some branches to be out of range.
344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# RUN: python %s | llc -mtriple=s390x-linux-gnu | FileCheck %s
444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# Construct:
644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#
744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# before0:
844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   conditional branch to after0
944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   ...
1044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# beforeN:
1144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   conditional branch to after0
1244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# main:
1344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   0xffd8 bytes, from MVIY instructions
1444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   conditional branch to main
1544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# after0:
1644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   ...
1744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#   conditional branch to main
1844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# afterN:
1944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#
2044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# Each conditional branch sequence occupies 8 bytes if it uses a short branch
2144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# and 10 if it uses a long one.  The ones before "main:" have to take the branch
2244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# length into account -- which is 4 bytes for short branches -- so the final
2344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# (0x28 - 4) / 8 == 4 blocks can use short branches.  The ones after "main:"
2444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# do not, so the first 0x28 / 8 == 5 can use short branches.  However,
2544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# the conservative algorithm we use makes one branch unnecessarily long
2644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# on each side.
2744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#
2844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 0(%r3)
2944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL:\.L[^ ]*]]
3044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 4(%r3)
3144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
3244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 8(%r3)
3344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
3444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 12(%r3)
3544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
3644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 16(%r3)
3744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
3844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 20(%r3)
3944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
4044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 24(%r3)
4144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: j{{g?}}e [[LABEL]]
4244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 28(%r3)
4344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
4444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 32(%r3)
4544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
4644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 36(%r3)
4744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
4844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# ...main goes here...
4944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 100(%r3)
5044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL:\.L[^ ]*]]
5144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 104(%r3)
5244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
5344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 108(%r3)
5444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
5544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 112(%r3)
5644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: je [[LABEL]]
5744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 116(%r3)
5844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: j{{g?}}e [[LABEL]]
5944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 120(%r3)
6044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
6144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 124(%r3)
6244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
6344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 128(%r3)
6444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
6544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 132(%r3)
6644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
6744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: c %r4, 136(%r3)
6844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford# CHECK: jge [[LABEL]]
6944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordbranch_blocks = 10
7144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordmain_size = 0xffd8
7244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint 'define void @f1(i8 *%base, i32 *%stop, i32 %limit) {'
7444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint 'entry:'
7544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint '  br label %before0'
7644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint ''
7744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordfor i in xrange(branch_blocks):
7944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    next = 'before%d' % (i + 1) if i + 1 < branch_blocks else 'main'
8044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print 'before%d:' % i
8144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  %%bstop%d = getelementptr i32 *%%stop, i64 %d' % (i, i)
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    print '  %%bcur%d = load i32 *%%bstop%d' % (i, i)
8344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  %%btest%d = icmp eq i32 %%limit, %%bcur%d' % (i, i)
8444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  br i1 %%btest%d, label %%after0, label %%%s' % (i, next)
8544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print ''
8644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
8744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint '%s:' % next
8844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiforda, b = 1, 1
8944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordfor i in xrange(0, main_size, 6):
9044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    a, b = b, a + b
9144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    offset = 4096 + b % 500000
9244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    value = a % 256
9344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  %%ptr%d = getelementptr i8 *%%base, i64 %d' % (i, offset)
9444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  store volatile i8 %d, i8 *%%ptr%d' % (value, i)
9544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
9644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordfor i in xrange(branch_blocks):
9744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  %%astop%d = getelementptr i32 *%%stop, i64 %d' % (i, i + 25)
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    print '  %%acur%d = load i32 *%%astop%d' % (i, i)
9944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  %%atest%d = icmp eq i32 %%limit, %%acur%d' % (i, i)
10044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print '  br i1 %%atest%d, label %%main, label %%after%d' % (i, i)
10144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print ''
10244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    print 'after%d:' % i
10344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
10444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint '  ret void'
10544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordprint '}'
106