1d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# Test 64-bit COMPARE AND BRANCH in cases where the sheer number of 2d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# instructions causes some branches to be out of range. 3d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# RUN: python %s | llc -mtriple=s390x-linux-gnu | FileCheck %s 4d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 5d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# Construct: 6d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# 7d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# before0: 8d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# conditional branch to after0 9d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# ... 10d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# beforeN: 11d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# conditional branch to after0 12d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# main: 13d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# 0xffcc bytes, from MVIY instructions 14d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# conditional branch to main 15d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# after0: 16d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# ... 17d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# conditional branch to main 18d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# afterN: 19d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# 20d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# Each conditional branch sequence occupies 12 bytes if it uses a short 21d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# branch and 16 if it uses a long one. The ones before "main:" have to 22d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# take the branch length into account, which is 6 for short branches, 23d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# so the final (0x34 - 6) / 12 == 3 blocks can use short branches. 24d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# The ones after "main:" do not, so the first 0x34 / 12 == 4 blocks 25d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# can use short branches. The conservative algorithm we use makes 26d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# one of the forward branches unnecessarily long, as noted in the 27d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# check output below. 28d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# 29d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 0(%r3) 30d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 31d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL:\.L[^ ]*]] 32d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 1(%r3) 33d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 34d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 35d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 2(%r3) 36d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 37d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 38d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 3(%r3) 39d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 40d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 41d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 4(%r3) 42d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 43d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 44d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# ...as mentioned above, the next one could be a CGRJE instead... 45d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 5(%r3) 46d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 47d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 48d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 6(%r3) 49d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL]] 50d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 7(%r3) 51d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL]] 52d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# ...main goes here... 53d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 25(%r3) 54d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL:\.L[^ ]*]] 55d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 26(%r3) 56d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL]] 57d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 27(%r3) 58d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL]] 59d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 28(%r3) 60d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgrje %r4, [[REG]], [[LABEL]] 61d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 29(%r3) 62d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 63d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 64d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 30(%r3) 65d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 66d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 67d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 31(%r3) 68d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 69d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 70d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: lgb [[REG:%r[0-5]]], 32(%r3) 71d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: cgr %r4, [[REG]] 72d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford# CHECK: jge [[LABEL]] 73d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 74d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordbranch_blocks = 8 75d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordmain_size = 0xffcc 76d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 77d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint 'define void @f1(i8 *%base, i8 *%stop, i64 %limit) {' 78d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint 'entry:' 79d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint ' br label %before0' 80d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint '' 81d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 82d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordfor i in xrange(branch_blocks): 83d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford next = 'before%d' % (i + 1) if i + 1 < branch_blocks else 'main' 84d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print 'before%d:' % i 85d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%bstop%d = getelementptr i8 *%%stop, i64 %d' % (i, i) 86d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%bcur%d = load volatile i8 *%%bstop%d' % (i, i) 87d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%bext%d = sext i8 %%bcur%d to i64' % (i, i) 88d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%btest%d = icmp eq i64 %%limit, %%bext%d' % (i, i) 89d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' br i1 %%btest%d, label %%after0, label %%%s' % (i, next) 90d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print '' 91d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 92d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint '%s:' % next 93d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiforda, b = 1, 1 94d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordfor i in xrange(0, main_size, 6): 95d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford a, b = b, a + b 96d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford offset = 4096 + b % 500000 97d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford value = a % 256 98d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%ptr%d = getelementptr i8 *%%base, i64 %d' % (i, offset) 99d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' store volatile i8 %d, i8 *%%ptr%d' % (value, i) 100d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 101d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordfor i in xrange(branch_blocks): 102d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%astop%d = getelementptr i8 *%%stop, i64 %d' % (i, i + 25) 103d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%acur%d = load volatile i8 *%%astop%d' % (i, i) 104d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%aext%d = sext i8 %%acur%d to i64' % (i, i) 105d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' %%atest%d = icmp eq i64 %%limit, %%aext%d' % (i, i) 106d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print ' br i1 %%atest%d, label %%main, label %%after%d' % (i, i) 107d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print '' 108d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford print 'after%d:' % i 109d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford 110d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint ' ret void' 111d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordprint '}' 112