Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -O2 | FileCheck %s |
| 2 | |
| 3 | ; The following cases are for i16 |
| 4 | |
| 5 | %struct.s_signed_i16 = type { i16, i16, i16 } |
| 6 | %struct.s_unsigned_i16 = type { i16, i16, i16 } |
| 7 | |
| 8 | @cost_s_i8_i16 = common global %struct.s_signed_i16 zeroinitializer, align 2 |
| 9 | @cost_u_i16 = common global %struct.s_unsigned_i16 zeroinitializer, align 2 |
| 10 | |
| 11 | define void @test_i16_2cmp_signed_1() { |
| 12 | ; CHECK-LABEL: test_i16_2cmp_signed_1 |
| 13 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 14 | ; CHECK-NEXT: b.lt |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 15 | ; CHECK-NOT: cmp |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 16 | ; CHECK: ret |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 17 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 18 | %0 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 1), align 2 |
| 19 | %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 20 | %cmp = icmp sgt i16 %0, %1 |
| 21 | br i1 %cmp, label %if.then, label %if.else |
| 22 | |
| 23 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 24 | store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 25 | br label %if.end8 |
| 26 | |
| 27 | if.else: ; preds = %entry |
| 28 | %cmp5 = icmp eq i16 %0, %1 |
| 29 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 30 | |
| 31 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 32 | store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 33 | br label %if.end8 |
| 34 | |
| 35 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 36 | ret void |
| 37 | } |
| 38 | |
| 39 | define void @test_i16_2cmp_signed_2() { |
| 40 | ; CHECK-LABEL: test_i16_2cmp_signed_2 |
| 41 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 42 | ; CHECK-NEXT: b.gt |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 43 | ; CHECK-NOT: cmp |
| 44 | ; CHECK: b.ge |
| 45 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 46 | %0 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 1), align 2 |
| 47 | %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 48 | %cmp = icmp sgt i16 %0, %1 |
| 49 | br i1 %cmp, label %if.then, label %if.else |
| 50 | |
| 51 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 52 | store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 53 | br label %if.end8 |
| 54 | |
| 55 | if.else: ; preds = %entry |
| 56 | %cmp5 = icmp slt i16 %0, %1 |
| 57 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 58 | |
| 59 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 60 | store i16 %1, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 61 | br label %if.end8 |
| 62 | |
| 63 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 64 | ret void |
| 65 | } |
| 66 | |
| 67 | define void @test_i16_2cmp_unsigned_1() { |
| 68 | ; CHECK-LABEL: test_i16_2cmp_unsigned_1 |
| 69 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 70 | ; CHECK-NEXT: b.lo |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 71 | ; CHECK-NOT: cmp |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 72 | ; CHECK: ret |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 73 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 74 | %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2 |
| 75 | %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 76 | %cmp = icmp ugt i16 %0, %1 |
| 77 | br i1 %cmp, label %if.then, label %if.else |
| 78 | |
| 79 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 80 | store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 81 | br label %if.end8 |
| 82 | |
| 83 | if.else: ; preds = %entry |
| 84 | %cmp5 = icmp eq i16 %0, %1 |
| 85 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 86 | |
| 87 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 88 | store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 89 | br label %if.end8 |
| 90 | |
| 91 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 92 | ret void |
| 93 | } |
| 94 | |
| 95 | define void @test_i16_2cmp_unsigned_2() { |
| 96 | ; CHECK-LABEL: test_i16_2cmp_unsigned_2 |
| 97 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 98 | ; CHECK-NEXT: b.hi |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 99 | ; CHECK-NOT: cmp |
| 100 | ; CHECK: b.hs |
| 101 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 102 | %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2 |
| 103 | %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 104 | %cmp = icmp ugt i16 %0, %1 |
| 105 | br i1 %cmp, label %if.then, label %if.else |
| 106 | |
| 107 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 108 | store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 109 | br label %if.end8 |
| 110 | |
| 111 | if.else: ; preds = %entry |
| 112 | %cmp5 = icmp ult i16 %0, %1 |
| 113 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 114 | |
| 115 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 116 | store i16 %1, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 117 | br label %if.end8 |
| 118 | |
| 119 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 120 | ret void |
| 121 | } |
| 122 | |
| 123 | ; The following cases are for i8 |
| 124 | |
| 125 | %struct.s_signed_i8 = type { i8, i8, i8 } |
| 126 | %struct.s_unsigned_i8 = type { i8, i8, i8 } |
| 127 | |
| 128 | @cost_s = common global %struct.s_signed_i8 zeroinitializer, align 2 |
| 129 | @cost_u_i8 = common global %struct.s_unsigned_i8 zeroinitializer, align 2 |
| 130 | |
| 131 | |
| 132 | define void @test_i8_2cmp_signed_1() { |
| 133 | ; CHECK-LABEL: test_i8_2cmp_signed_1 |
| 134 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 135 | ; CHECK-NEXT: b.lt |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 136 | ; CHECK-NOT: cmp |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 137 | ; CHECK: ret |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 138 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 139 | %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2 |
| 140 | %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 141 | %cmp = icmp sgt i8 %0, %1 |
| 142 | br i1 %cmp, label %if.then, label %if.else |
| 143 | |
| 144 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 145 | store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 146 | br label %if.end8 |
| 147 | |
| 148 | if.else: ; preds = %entry |
| 149 | %cmp5 = icmp eq i8 %0, %1 |
| 150 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 151 | |
| 152 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 153 | store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 154 | br label %if.end8 |
| 155 | |
| 156 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 157 | ret void |
| 158 | } |
| 159 | |
| 160 | define void @test_i8_2cmp_signed_2() { |
| 161 | ; CHECK-LABEL: test_i8_2cmp_signed_2 |
| 162 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 163 | ; CHECK-NEXT: b.gt |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 164 | ; CHECK-NOT: cmp |
| 165 | ; CHECK: b.ge |
| 166 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 167 | %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2 |
| 168 | %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 169 | %cmp = icmp sgt i8 %0, %1 |
| 170 | br i1 %cmp, label %if.then, label %if.else |
| 171 | |
| 172 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 173 | store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 174 | br label %if.end8 |
| 175 | |
| 176 | if.else: ; preds = %entry |
| 177 | %cmp5 = icmp slt i8 %0, %1 |
| 178 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 179 | |
| 180 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 181 | store i8 %1, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 182 | br label %if.end8 |
| 183 | |
| 184 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 185 | ret void |
| 186 | } |
| 187 | |
| 188 | define void @test_i8_2cmp_unsigned_1() { |
| 189 | ; CHECK-LABEL: test_i8_2cmp_unsigned_1 |
| 190 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 191 | ; CHECK-NEXT: b.lo |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 192 | ; CHECK-NOT: cmp |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 193 | ; CHECK: ret |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 194 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 195 | %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2 |
| 196 | %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 197 | %cmp = icmp ugt i8 %0, %1 |
| 198 | br i1 %cmp, label %if.then, label %if.else |
| 199 | |
| 200 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 201 | store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 202 | br label %if.end8 |
| 203 | |
| 204 | if.else: ; preds = %entry |
| 205 | %cmp5 = icmp eq i8 %0, %1 |
| 206 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 207 | |
| 208 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 209 | store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 210 | br label %if.end8 |
| 211 | |
| 212 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 213 | ret void |
| 214 | } |
| 215 | |
| 216 | define void @test_i8_2cmp_unsigned_2() { |
| 217 | ; CHECK-LABEL: test_i8_2cmp_unsigned_2 |
| 218 | ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}} |
James Molloy | 88cad7e | 2016-09-01 12:58:13 +0000 | [diff] [blame] | 219 | ; CHECK-NEXT: b.hi |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 220 | ; CHECK-NOT: cmp |
| 221 | ; CHECK: b.hs |
| 222 | entry: |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 223 | %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2 |
| 224 | %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 225 | %cmp = icmp ugt i8 %0, %1 |
| 226 | br i1 %cmp, label %if.then, label %if.else |
| 227 | |
| 228 | if.then: ; preds = %entry |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 229 | store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 230 | br label %if.end8 |
| 231 | |
| 232 | if.else: ; preds = %entry |
| 233 | %cmp5 = icmp ult i8 %0, %1 |
| 234 | br i1 %cmp5, label %if.then7, label %if.end8 |
| 235 | |
| 236 | if.then7: ; preds = %if.else |
David Blaikie | f72d05b | 2015-03-13 18:20:45 +0000 | [diff] [blame] | 237 | store i8 %1, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2 |
Jiangning Liu | ffbc690 | 2014-09-19 05:30:35 +0000 | [diff] [blame] | 238 | br label %if.end8 |
| 239 | |
| 240 | if.end8: ; preds = %if.else, %if.then7, %if.then |
| 241 | ret void |
| 242 | } |
| 243 | |
| 244 | ; Make sure the case below won't crash. |
| 245 | |
| 246 | ; The optimization of ZERO_EXTEND and SIGN_EXTEND in type legalization stage can't assert |
| 247 | ; the operand of a set_cc is always a TRUNCATE. |
| 248 | |
| 249 | define i1 @foo(float %inl, float %inr) { |
| 250 | %lval = fptosi float %inl to i8 |
| 251 | %rval = fptosi float %inr to i8 |
| 252 | %sum = icmp eq i8 %lval, %rval |
| 253 | ret i1 %sum |
| 254 | } |