1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -verify-machineinstrs -show-mc-encoding | FileCheck %s 3 4 target triple = "x86_64-unknown-unknown" 5 6 @g64 = external global i64, align 8 7 @g32 = external global i32, align 4 8 @g16 = external global i16, align 2 9 @g8 = external global i8, align 1 10 11 declare void @a() 12 declare void @b() 13 14 define void @add64_imm32_br() nounwind { 15 ; CHECK-LABEL: add64_imm32_br: 16 ; CHECK: # %bb.0: # %entry 17 ; CHECK-NEXT: addq $16777214, {{.*}}(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0xfe,0xff,0xff,0x00] 18 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 19 ; CHECK-NEXT: # imm = 0xFFFFFE 20 ; CHECK-NEXT: js .LBB0_1 # encoding: [0x78,A] 21 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB0_1-1, kind: FK_PCRel_1 22 ; CHECK-NEXT: # %bb.2: # %b 23 ; CHECK-NEXT: jmp b # TAILCALL 24 ; CHECK-NEXT: # encoding: [0xeb,A] 25 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 26 ; CHECK-NEXT: .LBB0_1: # %a 27 ; CHECK-NEXT: jmp a # TAILCALL 28 ; CHECK-NEXT: # encoding: [0xeb,A] 29 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 30 entry: 31 %load1 = load i64, i64* @g64 32 ; Add 0x00FFFFFE, a positive immediate requiring 24-bits. 33 %add = add i64 %load1, 16777214 34 store i64 %add, i64* @g64 35 %cond = icmp slt i64 %add, 0 36 br i1 %cond, label %a, label %b 37 38 a: 39 tail call void @a() 40 ret void 41 42 b: 43 tail call void @b() 44 ret void 45 } 46 47 define void @add64_sext_imm32_br() nounwind { 48 ; CHECK-LABEL: add64_sext_imm32_br: 49 ; CHECK: # %bb.0: # %entry 50 ; CHECK-NEXT: addq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80] 51 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 52 ; CHECK-NEXT: # imm = 0x80000000 53 ; CHECK-NEXT: js .LBB1_1 # encoding: [0x78,A] 54 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB1_1-1, kind: FK_PCRel_1 55 ; CHECK-NEXT: # %bb.2: # %b 56 ; CHECK-NEXT: jmp b # TAILCALL 57 ; CHECK-NEXT: # encoding: [0xeb,A] 58 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 59 ; CHECK-NEXT: .LBB1_1: # %a 60 ; CHECK-NEXT: jmp a # TAILCALL 61 ; CHECK-NEXT: # encoding: [0xeb,A] 62 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 63 entry: 64 %load1 = load i64, i64* @g64 65 ; Add -0x80000000, which requires sign-extended 32 bits. 66 %add = add i64 %load1, -2147483648 67 store i64 %add, i64* @g64 68 %cond = icmp slt i64 %add, 0 69 br i1 %cond, label %a, label %b 70 71 a: 72 tail call void @a() 73 ret void 74 75 b: 76 tail call void @b() 77 ret void 78 } 79 80 define void @add64_imm32_via_sub_br() nounwind { 81 ; CHECK-LABEL: add64_imm32_via_sub_br: 82 ; CHECK: # %bb.0: # %entry 83 ; CHECK-NEXT: subq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80] 84 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 85 ; CHECK-NEXT: # imm = 0x80000000 86 ; CHECK-NEXT: js .LBB2_1 # encoding: [0x78,A] 87 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB2_1-1, kind: FK_PCRel_1 88 ; CHECK-NEXT: # %bb.2: # %b 89 ; CHECK-NEXT: jmp b # TAILCALL 90 ; CHECK-NEXT: # encoding: [0xeb,A] 91 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 92 ; CHECK-NEXT: .LBB2_1: # %a 93 ; CHECK-NEXT: jmp a # TAILCALL 94 ; CHECK-NEXT: # encoding: [0xeb,A] 95 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 96 entry: 97 %load1 = load i64, i64* @g64 98 ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate. This 99 ; get's folded because we can instead subtract -0x80000000. 100 %add = add i64 %load1, 2147483648 101 store i64 %add, i64* @g64 102 %cond = icmp slt i64 %add, 0 103 br i1 %cond, label %a, label %b 104 105 a: 106 tail call void @a() 107 ret void 108 109 b: 110 tail call void @b() 111 ret void 112 } 113 114 define void @add64_no_imm32_via_sub_due_to_cf_br() nounwind { 115 ; CHECK-LABEL: add64_no_imm32_via_sub_due_to_cf_br: 116 ; CHECK: # %bb.0: # %entry 117 ; CHECK-NEXT: movl $2147483648, %eax # encoding: [0xb8,0x00,0x00,0x00,0x80] 118 ; CHECK-NEXT: # imm = 0x80000000 119 ; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A] 120 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 121 ; CHECK-NEXT: jae .LBB3_2 # encoding: [0x73,A] 122 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB3_2-1, kind: FK_PCRel_1 123 ; CHECK-NEXT: # %bb.1: # %a 124 ; CHECK-NEXT: jmp a # TAILCALL 125 ; CHECK-NEXT: # encoding: [0xeb,A] 126 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 127 ; CHECK-NEXT: .LBB3_2: # %b 128 ; CHECK-NEXT: jmp b # TAILCALL 129 ; CHECK-NEXT: # encoding: [0xeb,A] 130 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 131 entry: 132 %load1 = load i64, i64* @g64 133 ; Add 0x80000000, which cannot fit in a sign extended 32-bit immediate, but 134 ; could in theory be folded into an immediate operand of a sub. However, we 135 ; use the CF flag here and so shouldn't make that transformation. 136 %add = add i64 %load1, 2147483648 137 store i64 %add, i64* @g64 138 %cond = icmp ult i64 %add, 2147483648 139 br i1 %cond, label %a, label %b 140 141 a: 142 tail call void @a() 143 ret void 144 145 b: 146 tail call void @b() 147 ret void 148 } 149 150 define void @add64_too_large_imm32_br() nounwind { 151 ; CHECK-LABEL: add64_too_large_imm32_br: 152 ; CHECK: # %bb.0: # %entry 153 ; CHECK-NEXT: movl $2147483649, %eax # encoding: [0xb8,0x01,0x00,0x00,0x80] 154 ; CHECK-NEXT: # imm = 0x80000001 155 ; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A] 156 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 157 ; CHECK-NEXT: js .LBB4_1 # encoding: [0x78,A] 158 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB4_1-1, kind: FK_PCRel_1 159 ; CHECK-NEXT: # %bb.2: # %b 160 ; CHECK-NEXT: jmp b # TAILCALL 161 ; CHECK-NEXT: # encoding: [0xeb,A] 162 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 163 ; CHECK-NEXT: .LBB4_1: # %a 164 ; CHECK-NEXT: jmp a # TAILCALL 165 ; CHECK-NEXT: # encoding: [0xeb,A] 166 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 167 entry: 168 %load1 = load i64, i64* @g64 169 ; Add 0x80000001, which cannot fit in a sign extended 32-bit immediate. This 170 ; should not get folded into an immediate. 171 %add = add i64 %load1, 2147483649 172 store i64 %add, i64* @g64 173 %cond = icmp slt i64 %add, 0 174 br i1 %cond, label %a, label %b 175 176 a: 177 tail call void @a() 178 ret void 179 180 b: 181 tail call void @b() 182 ret void 183 } 184 185 define void @add64_imm8_via_sub_br() nounwind { 186 ; CHECK-LABEL: add64_imm8_via_sub_br: 187 ; CHECK: # %bb.0: # %entry 188 ; CHECK-NEXT: subq $-128, {{.*}}(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80] 189 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 190 ; CHECK-NEXT: js .LBB5_1 # encoding: [0x78,A] 191 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB5_1-1, kind: FK_PCRel_1 192 ; CHECK-NEXT: # %bb.2: # %b 193 ; CHECK-NEXT: jmp b # TAILCALL 194 ; CHECK-NEXT: # encoding: [0xeb,A] 195 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 196 ; CHECK-NEXT: .LBB5_1: # %a 197 ; CHECK-NEXT: jmp a # TAILCALL 198 ; CHECK-NEXT: # encoding: [0xeb,A] 199 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 200 entry: 201 %load1 = load i64, i64* @g64 202 ; Add 0x80 which can't quite fit into an imm8 because it would be sign 203 ; extended, but which can fit if we convert to a sub and negate the value. 204 %add = add i64 %load1, 128 205 store i64 %add, i64* @g64 206 %cond = icmp slt i64 %add, 0 207 br i1 %cond, label %a, label %b 208 209 a: 210 tail call void @a() 211 ret void 212 213 b: 214 tail call void @b() 215 ret void 216 } 217 218 define void @add64_imm8_br() nounwind { 219 ; CHECK-LABEL: add64_imm8_br: 220 ; CHECK: # %bb.0: # %entry 221 ; CHECK-NEXT: addq $42, {{.*}}(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0x2a] 222 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 223 ; CHECK-NEXT: js .LBB6_1 # encoding: [0x78,A] 224 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB6_1-1, kind: FK_PCRel_1 225 ; CHECK-NEXT: # %bb.2: # %b 226 ; CHECK-NEXT: jmp b # TAILCALL 227 ; CHECK-NEXT: # encoding: [0xeb,A] 228 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 229 ; CHECK-NEXT: .LBB6_1: # %a 230 ; CHECK-NEXT: jmp a # TAILCALL 231 ; CHECK-NEXT: # encoding: [0xeb,A] 232 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 233 entry: 234 %load1 = load i64, i64* @g64 235 %add = add i64 %load1, 42 236 store i64 %add, i64* @g64 237 %cond = icmp slt i64 %add, 0 238 br i1 %cond, label %a, label %b 239 240 a: 241 tail call void @a() 242 ret void 243 244 b: 245 tail call void @b() 246 ret void 247 } 248 249 define void @add64_imm8_neg_br() nounwind { 250 ; CHECK-LABEL: add64_imm8_neg_br: 251 ; CHECK: # %bb.0: # %entry 252 ; CHECK-NEXT: addq $-42, {{.*}}(%rip) # encoding: [0x48,0x83,0x05,A,A,A,A,0xd6] 253 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 254 ; CHECK-NEXT: js .LBB7_1 # encoding: [0x78,A] 255 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB7_1-1, kind: FK_PCRel_1 256 ; CHECK-NEXT: # %bb.2: # %b 257 ; CHECK-NEXT: jmp b # TAILCALL 258 ; CHECK-NEXT: # encoding: [0xeb,A] 259 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 260 ; CHECK-NEXT: .LBB7_1: # %a 261 ; CHECK-NEXT: jmp a # TAILCALL 262 ; CHECK-NEXT: # encoding: [0xeb,A] 263 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 264 entry: 265 %load1 = load i64, i64* @g64 266 %add = add i64 %load1, -42 267 store i64 %add, i64* @g64 268 %cond = icmp slt i64 %add, 0 269 br i1 %cond, label %a, label %b 270 271 a: 272 tail call void @a() 273 ret void 274 275 b: 276 tail call void @b() 277 ret void 278 } 279 280 define void @add32_imm_br() nounwind { 281 ; CHECK-LABEL: add32_imm_br: 282 ; CHECK: # %bb.0: # %entry 283 ; CHECK-NEXT: addl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80] 284 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte 285 ; CHECK-NEXT: # imm = 0x80000000 286 ; CHECK-NEXT: js .LBB8_1 # encoding: [0x78,A] 287 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB8_1-1, kind: FK_PCRel_1 288 ; CHECK-NEXT: # %bb.2: # %b 289 ; CHECK-NEXT: jmp b # TAILCALL 290 ; CHECK-NEXT: # encoding: [0xeb,A] 291 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 292 ; CHECK-NEXT: .LBB8_1: # %a 293 ; CHECK-NEXT: jmp a # TAILCALL 294 ; CHECK-NEXT: # encoding: [0xeb,A] 295 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 296 entry: 297 %load1 = load i32, i32* @g32 298 ; Add 0x80000000, a positive number requiring 32 bits of immediate. 299 %add = add i32 %load1, 2147483648 300 store i32 %add, i32* @g32 301 %cond = icmp slt i32 %add, 0 302 br i1 %cond, label %a, label %b 303 304 a: 305 tail call void @a() 306 ret void 307 308 b: 309 tail call void @b() 310 ret void 311 } 312 313 define void @add32_imm8_br() nounwind { 314 ; CHECK-LABEL: add32_imm8_br: 315 ; CHECK: # %bb.0: # %entry 316 ; CHECK-NEXT: addl $42, {{.*}}(%rip) # encoding: [0x83,0x05,A,A,A,A,0x2a] 317 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 318 ; CHECK-NEXT: js .LBB9_1 # encoding: [0x78,A] 319 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB9_1-1, kind: FK_PCRel_1 320 ; CHECK-NEXT: # %bb.2: # %b 321 ; CHECK-NEXT: jmp b # TAILCALL 322 ; CHECK-NEXT: # encoding: [0xeb,A] 323 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 324 ; CHECK-NEXT: .LBB9_1: # %a 325 ; CHECK-NEXT: jmp a # TAILCALL 326 ; CHECK-NEXT: # encoding: [0xeb,A] 327 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 328 entry: 329 %load1 = load i32, i32* @g32 330 %add = add i32 %load1, 42 331 store i32 %add, i32* @g32 332 %cond = icmp slt i32 %add, 0 333 br i1 %cond, label %a, label %b 334 335 a: 336 tail call void @a() 337 ret void 338 339 b: 340 tail call void @b() 341 ret void 342 } 343 344 define void @add32_imm8_neg_br() nounwind { 345 ; CHECK-LABEL: add32_imm8_neg_br: 346 ; CHECK: # %bb.0: # %entry 347 ; CHECK-NEXT: addl $-42, {{.*}}(%rip) # encoding: [0x83,0x05,A,A,A,A,0xd6] 348 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 349 ; CHECK-NEXT: js .LBB10_1 # encoding: [0x78,A] 350 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB10_1-1, kind: FK_PCRel_1 351 ; CHECK-NEXT: # %bb.2: # %b 352 ; CHECK-NEXT: jmp b # TAILCALL 353 ; CHECK-NEXT: # encoding: [0xeb,A] 354 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 355 ; CHECK-NEXT: .LBB10_1: # %a 356 ; CHECK-NEXT: jmp a # TAILCALL 357 ; CHECK-NEXT: # encoding: [0xeb,A] 358 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 359 entry: 360 %load1 = load i32, i32* @g32 361 %add = add i32 %load1, -42 362 store i32 %add, i32* @g32 363 %cond = icmp slt i32 %add, 0 364 br i1 %cond, label %a, label %b 365 366 a: 367 tail call void @a() 368 ret void 369 370 b: 371 tail call void @b() 372 ret void 373 } 374 375 define void @add16_imm_br() nounwind { 376 ; CHECK-LABEL: add16_imm_br: 377 ; CHECK: # %bb.0: # %entry 378 ; CHECK-NEXT: addw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80] 379 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte 380 ; CHECK-NEXT: # imm = 0x8000 381 ; CHECK-NEXT: js .LBB11_1 # encoding: [0x78,A] 382 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB11_1-1, kind: FK_PCRel_1 383 ; CHECK-NEXT: # %bb.2: # %b 384 ; CHECK-NEXT: jmp b # TAILCALL 385 ; CHECK-NEXT: # encoding: [0xeb,A] 386 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 387 ; CHECK-NEXT: .LBB11_1: # %a 388 ; CHECK-NEXT: jmp a # TAILCALL 389 ; CHECK-NEXT: # encoding: [0xeb,A] 390 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 391 entry: 392 %load1 = load i16, i16* @g16 393 ; Add 0x8000, a positive number requiring 16 bits of immediate. 394 %add = add i16 %load1, 32768 395 store i16 %add, i16* @g16 396 %cond = icmp slt i16 %add, 0 397 br i1 %cond, label %a, label %b 398 399 a: 400 tail call void @a() 401 ret void 402 403 b: 404 tail call void @b() 405 ret void 406 } 407 408 define void @add16_imm8_br() nounwind { 409 ; CHECK-LABEL: add16_imm8_br: 410 ; CHECK: # %bb.0: # %entry 411 ; CHECK-NEXT: addw $42, {{.*}}(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0x2a] 412 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 413 ; CHECK-NEXT: js .LBB12_1 # encoding: [0x78,A] 414 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB12_1-1, kind: FK_PCRel_1 415 ; CHECK-NEXT: # %bb.2: # %b 416 ; CHECK-NEXT: jmp b # TAILCALL 417 ; CHECK-NEXT: # encoding: [0xeb,A] 418 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 419 ; CHECK-NEXT: .LBB12_1: # %a 420 ; CHECK-NEXT: jmp a # TAILCALL 421 ; CHECK-NEXT: # encoding: [0xeb,A] 422 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 423 entry: 424 %load1 = load i16, i16* @g16 425 %add = add i16 %load1, 42 426 store i16 %add, i16* @g16 427 %cond = icmp slt i16 %add, 0 428 br i1 %cond, label %a, label %b 429 430 a: 431 tail call void @a() 432 ret void 433 434 b: 435 tail call void @b() 436 ret void 437 } 438 439 define void @add16_imm8_neg_br() nounwind { 440 ; CHECK-LABEL: add16_imm8_neg_br: 441 ; CHECK: # %bb.0: # %entry 442 ; CHECK-NEXT: addw $-42, {{.*}}(%rip) # encoding: [0x66,0x83,0x05,A,A,A,A,0xd6] 443 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 444 ; CHECK-NEXT: js .LBB13_1 # encoding: [0x78,A] 445 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB13_1-1, kind: FK_PCRel_1 446 ; CHECK-NEXT: # %bb.2: # %b 447 ; CHECK-NEXT: jmp b # TAILCALL 448 ; CHECK-NEXT: # encoding: [0xeb,A] 449 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 450 ; CHECK-NEXT: .LBB13_1: # %a 451 ; CHECK-NEXT: jmp a # TAILCALL 452 ; CHECK-NEXT: # encoding: [0xeb,A] 453 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 454 entry: 455 %load1 = load i16, i16* @g16 456 %add = add i16 %load1, -42 457 store i16 %add, i16* @g16 458 %cond = icmp slt i16 %add, 0 459 br i1 %cond, label %a, label %b 460 461 a: 462 tail call void @a() 463 ret void 464 465 b: 466 tail call void @b() 467 ret void 468 } 469 470 define void @add8_imm_br() nounwind { 471 ; CHECK-LABEL: add8_imm_br: 472 ; CHECK: # %bb.0: # %entry 473 ; CHECK-NEXT: addb $-2, {{.*}}(%rip) # encoding: [0x80,0x05,A,A,A,A,0xfe] 474 ; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte 475 ; CHECK-NEXT: js .LBB14_1 # encoding: [0x78,A] 476 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB14_1-1, kind: FK_PCRel_1 477 ; CHECK-NEXT: # %bb.2: # %b 478 ; CHECK-NEXT: jmp b # TAILCALL 479 ; CHECK-NEXT: # encoding: [0xeb,A] 480 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 481 ; CHECK-NEXT: .LBB14_1: # %a 482 ; CHECK-NEXT: jmp a # TAILCALL 483 ; CHECK-NEXT: # encoding: [0xeb,A] 484 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 485 entry: 486 %load1 = load i8, i8* @g8 487 %add = add i8 %load1, -2 488 store i8 %add, i8* @g8 489 %cond = icmp slt i8 %add, 0 490 br i1 %cond, label %a, label %b 491 492 a: 493 tail call void @a() 494 ret void 495 496 b: 497 tail call void @b() 498 ret void 499 } 500 501 define void @add64_reg_br(i64 %arg) nounwind { 502 ; CHECK-LABEL: add64_reg_br: 503 ; CHECK: # %bb.0: # %entry 504 ; CHECK-NEXT: addq %rdi, {{.*}}(%rip) # encoding: [0x48,0x01,0x3d,A,A,A,A] 505 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 506 ; CHECK-NEXT: js .LBB15_1 # encoding: [0x78,A] 507 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB15_1-1, kind: FK_PCRel_1 508 ; CHECK-NEXT: # %bb.2: # %b 509 ; CHECK-NEXT: jmp b # TAILCALL 510 ; CHECK-NEXT: # encoding: [0xeb,A] 511 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 512 ; CHECK-NEXT: .LBB15_1: # %a 513 ; CHECK-NEXT: jmp a # TAILCALL 514 ; CHECK-NEXT: # encoding: [0xeb,A] 515 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 516 entry: 517 %load1 = load i64, i64* @g64 518 %add = add i64 %load1, %arg 519 store i64 %add, i64* @g64 520 %cond = icmp slt i64 %add, 0 521 br i1 %cond, label %a, label %b 522 523 a: 524 tail call void @a() 525 ret void 526 527 b: 528 tail call void @b() 529 ret void 530 } 531 532 define void @add32_reg_br(i32 %arg) nounwind { 533 ; CHECK-LABEL: add32_reg_br: 534 ; CHECK: # %bb.0: # %entry 535 ; CHECK-NEXT: addl %edi, {{.*}}(%rip) # encoding: [0x01,0x3d,A,A,A,A] 536 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte 537 ; CHECK-NEXT: js .LBB16_1 # encoding: [0x78,A] 538 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB16_1-1, kind: FK_PCRel_1 539 ; CHECK-NEXT: # %bb.2: # %b 540 ; CHECK-NEXT: jmp b # TAILCALL 541 ; CHECK-NEXT: # encoding: [0xeb,A] 542 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 543 ; CHECK-NEXT: .LBB16_1: # %a 544 ; CHECK-NEXT: jmp a # TAILCALL 545 ; CHECK-NEXT: # encoding: [0xeb,A] 546 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 547 entry: 548 %load1 = load i32, i32* @g32 549 %add = add i32 %load1, %arg 550 store i32 %add, i32* @g32 551 %cond = icmp slt i32 %add, 0 552 br i1 %cond, label %a, label %b 553 554 a: 555 tail call void @a() 556 ret void 557 558 b: 559 tail call void @b() 560 ret void 561 } 562 563 define void @add16_reg_br(i16 %arg) nounwind { 564 ; CHECK-LABEL: add16_reg_br: 565 ; CHECK: # %bb.0: # %entry 566 ; CHECK-NEXT: addw %di, {{.*}}(%rip) # encoding: [0x66,0x01,0x3d,A,A,A,A] 567 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte 568 ; CHECK-NEXT: js .LBB17_1 # encoding: [0x78,A] 569 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB17_1-1, kind: FK_PCRel_1 570 ; CHECK-NEXT: # %bb.2: # %b 571 ; CHECK-NEXT: jmp b # TAILCALL 572 ; CHECK-NEXT: # encoding: [0xeb,A] 573 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 574 ; CHECK-NEXT: .LBB17_1: # %a 575 ; CHECK-NEXT: jmp a # TAILCALL 576 ; CHECK-NEXT: # encoding: [0xeb,A] 577 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 578 entry: 579 %load1 = load i16, i16* @g16 580 %add = add i16 %load1, %arg 581 store i16 %add, i16* @g16 582 %cond = icmp slt i16 %add, 0 583 br i1 %cond, label %a, label %b 584 585 a: 586 tail call void @a() 587 ret void 588 589 b: 590 tail call void @b() 591 ret void 592 } 593 594 define void @add8_reg_br(i8 %arg) nounwind { 595 ; CHECK-LABEL: add8_reg_br: 596 ; CHECK: # %bb.0: # %entry 597 ; CHECK-NEXT: addb %dil, {{.*}}(%rip) # encoding: [0x40,0x00,0x3d,A,A,A,A] 598 ; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte 599 ; CHECK-NEXT: js .LBB18_1 # encoding: [0x78,A] 600 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB18_1-1, kind: FK_PCRel_1 601 ; CHECK-NEXT: # %bb.2: # %b 602 ; CHECK-NEXT: jmp b # TAILCALL 603 ; CHECK-NEXT: # encoding: [0xeb,A] 604 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 605 ; CHECK-NEXT: .LBB18_1: # %a 606 ; CHECK-NEXT: jmp a # TAILCALL 607 ; CHECK-NEXT: # encoding: [0xeb,A] 608 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 609 entry: 610 %load1 = load i8, i8* @g8 611 %add = add i8 %load1, %arg 612 store i8 %add, i8* @g8 613 %cond = icmp slt i8 %add, 0 614 br i1 %cond, label %a, label %b 615 616 a: 617 tail call void @a() 618 ret void 619 620 b: 621 tail call void @b() 622 ret void 623 } 624 625 define void @sub64_imm32_br() nounwind { 626 ; CHECK-LABEL: sub64_imm32_br: 627 ; CHECK: # %bb.0: # %entry 628 ; CHECK-NEXT: subq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x2d,A,A,A,A,0x00,0x00,0x00,0x80] 629 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 630 ; CHECK-NEXT: # imm = 0x80000000 631 ; CHECK-NEXT: js .LBB19_1 # encoding: [0x78,A] 632 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB19_1-1, kind: FK_PCRel_1 633 ; CHECK-NEXT: # %bb.2: # %b 634 ; CHECK-NEXT: jmp b # TAILCALL 635 ; CHECK-NEXT: # encoding: [0xeb,A] 636 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 637 ; CHECK-NEXT: .LBB19_1: # %a 638 ; CHECK-NEXT: jmp a # TAILCALL 639 ; CHECK-NEXT: # encoding: [0xeb,A] 640 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 641 entry: 642 %load1 = load i64, i64* @g64 643 ; Subtract -0x80000000, which can't be negated into a sign-extended 32-bit 644 ; immediate, so that we have to select sub here. 645 %sub = sub i64 %load1, -2147483648 646 store i64 %sub, i64* @g64 647 %cond = icmp slt i64 %sub, 0 648 br i1 %cond, label %a, label %b 649 650 a: 651 tail call void @a() 652 ret void 653 654 b: 655 tail call void @b() 656 ret void 657 } 658 659 define void @sub64_too_large_imm32_br() nounwind { 660 ; CHECK-LABEL: sub64_too_large_imm32_br: 661 ; CHECK: # %bb.0: # %entry 662 ; CHECK-NEXT: movabsq $-4294967295, %rax # encoding: [0x48,0xb8,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff] 663 ; CHECK-NEXT: # imm = 0xFFFFFFFF00000001 664 ; CHECK-NEXT: addq %rax, {{.*}}(%rip) # encoding: [0x48,0x01,0x05,A,A,A,A] 665 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 666 ; CHECK-NEXT: js .LBB20_1 # encoding: [0x78,A] 667 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB20_1-1, kind: FK_PCRel_1 668 ; CHECK-NEXT: # %bb.2: # %b 669 ; CHECK-NEXT: jmp b # TAILCALL 670 ; CHECK-NEXT: # encoding: [0xeb,A] 671 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 672 ; CHECK-NEXT: .LBB20_1: # %a 673 ; CHECK-NEXT: jmp a # TAILCALL 674 ; CHECK-NEXT: # encoding: [0xeb,A] 675 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 676 entry: 677 %load1 = load i64, i64* @g64 678 ; Subtract 0xFFFFFFFF, which cannot fit in a sign extended 32-bit immediate, 679 ; even if negated and sign extended as an add. 680 %sub = sub i64 %load1, 4294967295 681 store i64 %sub, i64* @g64 682 %cond = icmp slt i64 %sub, 0 683 br i1 %cond, label %a, label %b 684 685 a: 686 tail call void @a() 687 ret void 688 689 b: 690 tail call void @b() 691 ret void 692 } 693 694 define void @sub64_imm8_br() nounwind { 695 ; CHECK-LABEL: sub64_imm8_br: 696 ; CHECK: # %bb.0: # %entry 697 ; CHECK-NEXT: subq $-128, {{.*}}(%rip) # encoding: [0x48,0x83,0x2d,A,A,A,A,0x80] 698 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 699 ; CHECK-NEXT: js .LBB21_1 # encoding: [0x78,A] 700 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB21_1-1, kind: FK_PCRel_1 701 ; CHECK-NEXT: # %bb.2: # %b 702 ; CHECK-NEXT: jmp b # TAILCALL 703 ; CHECK-NEXT: # encoding: [0xeb,A] 704 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 705 ; CHECK-NEXT: .LBB21_1: # %a 706 ; CHECK-NEXT: jmp a # TAILCALL 707 ; CHECK-NEXT: # encoding: [0xeb,A] 708 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 709 entry: 710 %load1 = load i64, i64* @g64 711 ; Subtract -0x80, which can be done with an 8-bit immediate but only as 712 ; a subtract where that immediate can be negative. 713 %sub = sub i64 %load1, -128 714 store i64 %sub, i64* @g64 715 %cond = icmp slt i64 %sub, 0 716 br i1 %cond, label %a, label %b 717 718 a: 719 tail call void @a() 720 ret void 721 722 b: 723 tail call void @b() 724 ret void 725 } 726 727 define void @sub32_imm_br() nounwind { 728 ; CHECK-LABEL: sub32_imm_br: 729 ; CHECK: # %bb.0: # %entry 730 ; CHECK-NEXT: addl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x05,A,A,A,A,0x00,0x00,0x00,0x80] 731 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte 732 ; CHECK-NEXT: # imm = 0x80000000 733 ; CHECK-NEXT: js .LBB22_1 # encoding: [0x78,A] 734 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB22_1-1, kind: FK_PCRel_1 735 ; CHECK-NEXT: # %bb.2: # %b 736 ; CHECK-NEXT: jmp b # TAILCALL 737 ; CHECK-NEXT: # encoding: [0xeb,A] 738 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 739 ; CHECK-NEXT: .LBB22_1: # %a 740 ; CHECK-NEXT: jmp a # TAILCALL 741 ; CHECK-NEXT: # encoding: [0xeb,A] 742 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 743 entry: 744 %load1 = load i32, i32* @g32 745 ; Subtract -0x80000000, which requires 32 bits of immediate but still gets 746 ; lowered as an add. 747 %sub = sub i32 %load1, -2147483648 748 store i32 %sub, i32* @g32 749 %cond = icmp slt i32 %sub, 0 750 br i1 %cond, label %a, label %b 751 752 a: 753 tail call void @a() 754 ret void 755 756 b: 757 tail call void @b() 758 ret void 759 } 760 761 define void @sub32_imm8_br() nounwind { 762 ; CHECK-LABEL: sub32_imm8_br: 763 ; CHECK: # %bb.0: # %entry 764 ; CHECK-NEXT: subl $-128, {{.*}}(%rip) # encoding: [0x83,0x2d,A,A,A,A,0x80] 765 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 766 ; CHECK-NEXT: js .LBB23_1 # encoding: [0x78,A] 767 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB23_1-1, kind: FK_PCRel_1 768 ; CHECK-NEXT: # %bb.2: # %b 769 ; CHECK-NEXT: jmp b # TAILCALL 770 ; CHECK-NEXT: # encoding: [0xeb,A] 771 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 772 ; CHECK-NEXT: .LBB23_1: # %a 773 ; CHECK-NEXT: jmp a # TAILCALL 774 ; CHECK-NEXT: # encoding: [0xeb,A] 775 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 776 entry: 777 %load1 = load i32, i32* @g32 778 ; Subtract -0x80, which can be done with an 8-bit immediate but only as 779 ; a subtract where that immediate can be negative. 780 %sub = sub i32 %load1, -128 781 store i32 %sub, i32* @g32 782 %cond = icmp slt i32 %sub, 0 783 br i1 %cond, label %a, label %b 784 785 a: 786 tail call void @a() 787 ret void 788 789 b: 790 tail call void @b() 791 ret void 792 } 793 794 define void @sub16_imm_br() nounwind { 795 ; CHECK-LABEL: sub16_imm_br: 796 ; CHECK: # %bb.0: # %entry 797 ; CHECK-NEXT: addw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x05,A,A,A,A,0x00,0x80] 798 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte 799 ; CHECK-NEXT: # imm = 0x8000 800 ; CHECK-NEXT: js .LBB24_1 # encoding: [0x78,A] 801 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB24_1-1, kind: FK_PCRel_1 802 ; CHECK-NEXT: # %bb.2: # %b 803 ; CHECK-NEXT: jmp b # TAILCALL 804 ; CHECK-NEXT: # encoding: [0xeb,A] 805 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 806 ; CHECK-NEXT: .LBB24_1: # %a 807 ; CHECK-NEXT: jmp a # TAILCALL 808 ; CHECK-NEXT: # encoding: [0xeb,A] 809 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 810 entry: 811 %load1 = load i16, i16* @g16 812 ; Subtract -0x8000, which requires a 16 bits of immediate but still gets 813 ; lowered as an add. 814 %sub = sub i16 %load1, -32768 815 store i16 %sub, i16* @g16 816 %cond = icmp slt i16 %sub, 0 817 br i1 %cond, label %a, label %b 818 819 a: 820 tail call void @a() 821 ret void 822 823 b: 824 tail call void @b() 825 ret void 826 } 827 828 define void @sub16_imm8_br() nounwind { 829 ; CHECK-LABEL: sub16_imm8_br: 830 ; CHECK: # %bb.0: # %entry 831 ; CHECK-NEXT: subw $-128, {{.*}}(%rip) # encoding: [0x66,0x83,0x2d,A,A,A,A,0x80] 832 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 833 ; CHECK-NEXT: js .LBB25_1 # encoding: [0x78,A] 834 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB25_1-1, kind: FK_PCRel_1 835 ; CHECK-NEXT: # %bb.2: # %b 836 ; CHECK-NEXT: jmp b # TAILCALL 837 ; CHECK-NEXT: # encoding: [0xeb,A] 838 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 839 ; CHECK-NEXT: .LBB25_1: # %a 840 ; CHECK-NEXT: jmp a # TAILCALL 841 ; CHECK-NEXT: # encoding: [0xeb,A] 842 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 843 entry: 844 %load1 = load i16, i16* @g16 845 ; Subtract -0x80, which can be done with an 8-bit immediate but only as 846 ; a subtract where that immediate can be negative. 847 %sub = sub i16 %load1, -128 848 store i16 %sub, i16* @g16 849 %cond = icmp slt i16 %sub, 0 850 br i1 %cond, label %a, label %b 851 852 a: 853 tail call void @a() 854 ret void 855 856 b: 857 tail call void @b() 858 ret void 859 } 860 861 define void @sub8_imm_br() nounwind { 862 ; CHECK-LABEL: sub8_imm_br: 863 ; CHECK: # %bb.0: # %entry 864 ; CHECK-NEXT: addb $-128, {{.*}}(%rip) # encoding: [0x80,0x05,A,A,A,A,0x80] 865 ; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte 866 ; CHECK-NEXT: js .LBB26_1 # encoding: [0x78,A] 867 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB26_1-1, kind: FK_PCRel_1 868 ; CHECK-NEXT: # %bb.2: # %b 869 ; CHECK-NEXT: jmp b # TAILCALL 870 ; CHECK-NEXT: # encoding: [0xeb,A] 871 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 872 ; CHECK-NEXT: .LBB26_1: # %a 873 ; CHECK-NEXT: jmp a # TAILCALL 874 ; CHECK-NEXT: # encoding: [0xeb,A] 875 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 876 entry: 877 %load1 = load i8, i8* @g8 878 ; Subtract -0x80, which requires an 8-bit immediate but still gets lowered as 879 ; an add. 880 %sub = sub i8 %load1, -128 881 store i8 %sub, i8* @g8 882 %cond = icmp slt i8 %sub, 0 883 br i1 %cond, label %a, label %b 884 885 a: 886 tail call void @a() 887 ret void 888 889 b: 890 tail call void @b() 891 ret void 892 } 893 894 define void @sub64_reg_br(i64 %arg) nounwind { 895 ; CHECK-LABEL: sub64_reg_br: 896 ; CHECK: # %bb.0: # %entry 897 ; CHECK-NEXT: subq %rdi, {{.*}}(%rip) # encoding: [0x48,0x29,0x3d,A,A,A,A] 898 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 899 ; CHECK-NEXT: js .LBB27_1 # encoding: [0x78,A] 900 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB27_1-1, kind: FK_PCRel_1 901 ; CHECK-NEXT: # %bb.2: # %b 902 ; CHECK-NEXT: jmp b # TAILCALL 903 ; CHECK-NEXT: # encoding: [0xeb,A] 904 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 905 ; CHECK-NEXT: .LBB27_1: # %a 906 ; CHECK-NEXT: jmp a # TAILCALL 907 ; CHECK-NEXT: # encoding: [0xeb,A] 908 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 909 entry: 910 %load1 = load i64, i64* @g64 911 %sub = sub i64 %load1, %arg 912 store i64 %sub, i64* @g64 913 %cond = icmp slt i64 %sub, 0 914 br i1 %cond, label %a, label %b 915 916 a: 917 tail call void @a() 918 ret void 919 920 b: 921 tail call void @b() 922 ret void 923 } 924 925 define void @sub32_reg_br(i32 %arg) nounwind { 926 ; CHECK-LABEL: sub32_reg_br: 927 ; CHECK: # %bb.0: # %entry 928 ; CHECK-NEXT: subl %edi, {{.*}}(%rip) # encoding: [0x29,0x3d,A,A,A,A] 929 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte 930 ; CHECK-NEXT: js .LBB28_1 # encoding: [0x78,A] 931 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB28_1-1, kind: FK_PCRel_1 932 ; CHECK-NEXT: # %bb.2: # %b 933 ; CHECK-NEXT: jmp b # TAILCALL 934 ; CHECK-NEXT: # encoding: [0xeb,A] 935 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 936 ; CHECK-NEXT: .LBB28_1: # %a 937 ; CHECK-NEXT: jmp a # TAILCALL 938 ; CHECK-NEXT: # encoding: [0xeb,A] 939 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 940 entry: 941 %load1 = load i32, i32* @g32 942 %sub = sub i32 %load1, %arg 943 store i32 %sub, i32* @g32 944 %cond = icmp slt i32 %sub, 0 945 br i1 %cond, label %a, label %b 946 947 a: 948 tail call void @a() 949 ret void 950 951 b: 952 tail call void @b() 953 ret void 954 } 955 956 define void @sub16_reg_br(i16 %arg) nounwind { 957 ; CHECK-LABEL: sub16_reg_br: 958 ; CHECK: # %bb.0: # %entry 959 ; CHECK-NEXT: subw %di, {{.*}}(%rip) # encoding: [0x66,0x29,0x3d,A,A,A,A] 960 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte 961 ; CHECK-NEXT: js .LBB29_1 # encoding: [0x78,A] 962 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB29_1-1, kind: FK_PCRel_1 963 ; CHECK-NEXT: # %bb.2: # %b 964 ; CHECK-NEXT: jmp b # TAILCALL 965 ; CHECK-NEXT: # encoding: [0xeb,A] 966 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 967 ; CHECK-NEXT: .LBB29_1: # %a 968 ; CHECK-NEXT: jmp a # TAILCALL 969 ; CHECK-NEXT: # encoding: [0xeb,A] 970 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 971 entry: 972 %load1 = load i16, i16* @g16 973 %sub = sub i16 %load1, %arg 974 store i16 %sub, i16* @g16 975 %cond = icmp slt i16 %sub, 0 976 br i1 %cond, label %a, label %b 977 978 a: 979 tail call void @a() 980 ret void 981 982 b: 983 tail call void @b() 984 ret void 985 } 986 987 define void @sub8_reg_br(i8 %arg) nounwind { 988 ; CHECK-LABEL: sub8_reg_br: 989 ; CHECK: # %bb.0: # %entry 990 ; CHECK-NEXT: subb %dil, {{.*}}(%rip) # encoding: [0x40,0x28,0x3d,A,A,A,A] 991 ; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte 992 ; CHECK-NEXT: js .LBB30_1 # encoding: [0x78,A] 993 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB30_1-1, kind: FK_PCRel_1 994 ; CHECK-NEXT: # %bb.2: # %b 995 ; CHECK-NEXT: jmp b # TAILCALL 996 ; CHECK-NEXT: # encoding: [0xeb,A] 997 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 998 ; CHECK-NEXT: .LBB30_1: # %a 999 ; CHECK-NEXT: jmp a # TAILCALL 1000 ; CHECK-NEXT: # encoding: [0xeb,A] 1001 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1002 entry: 1003 %load1 = load i8, i8* @g8 1004 %sub = sub i8 %load1, %arg 1005 store i8 %sub, i8* @g8 1006 %cond = icmp slt i8 %sub, 0 1007 br i1 %cond, label %a, label %b 1008 1009 a: 1010 tail call void @a() 1011 ret void 1012 1013 b: 1014 tail call void @b() 1015 ret void 1016 } 1017 1018 define void @and64_imm32_br() nounwind { 1019 ; CHECK-LABEL: and64_imm32_br: 1020 ; CHECK: # %bb.0: # %entry 1021 ; CHECK-NEXT: andq $16777215, {{.*}}(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0xff,0xff,0xff,0x00] 1022 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 1023 ; CHECK-NEXT: # imm = 0xFFFFFF 1024 ; CHECK-NEXT: je .LBB31_1 # encoding: [0x74,A] 1025 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB31_1-1, kind: FK_PCRel_1 1026 ; CHECK-NEXT: # %bb.2: # %b 1027 ; CHECK-NEXT: jmp b # TAILCALL 1028 ; CHECK-NEXT: # encoding: [0xeb,A] 1029 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1030 ; CHECK-NEXT: .LBB31_1: # %a 1031 ; CHECK-NEXT: jmp a # TAILCALL 1032 ; CHECK-NEXT: # encoding: [0xeb,A] 1033 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1034 entry: 1035 %load1 = load i64, i64* @g64 1036 ; And 0x00FFFFFF, a positive immediate requiring 24-bits. 1037 %and = and i64 %load1, 16777215 1038 store i64 %and, i64* @g64 1039 %cond = icmp eq i64 %and, 0 1040 br i1 %cond, label %a, label %b 1041 1042 a: 1043 tail call void @a() 1044 ret void 1045 1046 b: 1047 tail call void @b() 1048 ret void 1049 } 1050 1051 define void @and64_sext_imm32_br() nounwind { 1052 ; CHECK-LABEL: and64_sext_imm32_br: 1053 ; CHECK: # %bb.0: # %entry 1054 ; CHECK-NEXT: andq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80] 1055 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 1056 ; CHECK-NEXT: # imm = 0x80000000 1057 ; CHECK-NEXT: je .LBB32_1 # encoding: [0x74,A] 1058 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB32_1-1, kind: FK_PCRel_1 1059 ; CHECK-NEXT: # %bb.2: # %b 1060 ; CHECK-NEXT: jmp b # TAILCALL 1061 ; CHECK-NEXT: # encoding: [0xeb,A] 1062 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1063 ; CHECK-NEXT: .LBB32_1: # %a 1064 ; CHECK-NEXT: jmp a # TAILCALL 1065 ; CHECK-NEXT: # encoding: [0xeb,A] 1066 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1067 entry: 1068 %load1 = load i64, i64* @g64 1069 ; And -0x80000000, which requires sign-extended 32 bits. 1070 %and = and i64 %load1, -2147483648 1071 store i64 %and, i64* @g64 1072 %cond = icmp eq i64 %and, 0 1073 br i1 %cond, label %a, label %b 1074 1075 a: 1076 tail call void @a() 1077 ret void 1078 1079 b: 1080 tail call void @b() 1081 ret void 1082 } 1083 1084 define void @and64_imm8_br() nounwind { 1085 ; CHECK-LABEL: and64_imm8_br: 1086 ; CHECK: # %bb.0: # %entry 1087 ; CHECK-NEXT: andq $15, {{.*}}(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0x0f] 1088 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 1089 ; CHECK-NEXT: je .LBB33_1 # encoding: [0x74,A] 1090 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB33_1-1, kind: FK_PCRel_1 1091 ; CHECK-NEXT: # %bb.2: # %b 1092 ; CHECK-NEXT: jmp b # TAILCALL 1093 ; CHECK-NEXT: # encoding: [0xeb,A] 1094 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1095 ; CHECK-NEXT: .LBB33_1: # %a 1096 ; CHECK-NEXT: jmp a # TAILCALL 1097 ; CHECK-NEXT: # encoding: [0xeb,A] 1098 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1099 entry: 1100 %load1 = load i64, i64* @g64 1101 %and = and i64 %load1, 15 1102 store i64 %and, i64* @g64 1103 %cond = icmp eq i64 %and, 0 1104 br i1 %cond, label %a, label %b 1105 1106 a: 1107 tail call void @a() 1108 ret void 1109 1110 b: 1111 tail call void @b() 1112 ret void 1113 } 1114 1115 define void @and64_imm8_neg_br() nounwind { 1116 ; CHECK-LABEL: and64_imm8_neg_br: 1117 ; CHECK: # %bb.0: # %entry 1118 ; CHECK-NEXT: andq $-4, {{.*}}(%rip) # encoding: [0x48,0x83,0x25,A,A,A,A,0xfc] 1119 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 1120 ; CHECK-NEXT: je .LBB34_1 # encoding: [0x74,A] 1121 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB34_1-1, kind: FK_PCRel_1 1122 ; CHECK-NEXT: # %bb.2: # %b 1123 ; CHECK-NEXT: jmp b # TAILCALL 1124 ; CHECK-NEXT: # encoding: [0xeb,A] 1125 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1126 ; CHECK-NEXT: .LBB34_1: # %a 1127 ; CHECK-NEXT: jmp a # TAILCALL 1128 ; CHECK-NEXT: # encoding: [0xeb,A] 1129 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1130 entry: 1131 %load1 = load i64, i64* @g64 1132 %and = and i64 %load1, -4 1133 store i64 %and, i64* @g64 1134 %cond = icmp eq i64 %and, 0 1135 br i1 %cond, label %a, label %b 1136 1137 a: 1138 tail call void @a() 1139 ret void 1140 1141 b: 1142 tail call void @b() 1143 ret void 1144 } 1145 1146 define void @and32_imm_br() nounwind { 1147 ; CHECK-LABEL: and32_imm_br: 1148 ; CHECK: # %bb.0: # %entry 1149 ; CHECK-NEXT: andl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x25,A,A,A,A,0x00,0x00,0x00,0x80] 1150 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte 1151 ; CHECK-NEXT: # imm = 0x80000000 1152 ; CHECK-NEXT: jne .LBB35_2 # encoding: [0x75,A] 1153 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB35_2-1, kind: FK_PCRel_1 1154 ; CHECK-NEXT: # %bb.1: # %a 1155 ; CHECK-NEXT: jmp a # TAILCALL 1156 ; CHECK-NEXT: # encoding: [0xeb,A] 1157 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1158 ; CHECK-NEXT: .LBB35_2: # %b 1159 ; CHECK-NEXT: jmp b # TAILCALL 1160 ; CHECK-NEXT: # encoding: [0xeb,A] 1161 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1162 entry: 1163 %load1 = load i32, i32* @g32 1164 ; And 0x80000000, a positive number requiring 32 bits of immediate. 1165 %and = and i32 %load1, 2147483648 1166 store i32 %and, i32* @g32 1167 %cond = icmp eq i32 %and, 0 1168 br i1 %cond, label %a, label %b 1169 1170 a: 1171 tail call void @a() 1172 ret void 1173 1174 b: 1175 tail call void @b() 1176 ret void 1177 } 1178 1179 define void @and32_imm8_br() nounwind { 1180 ; CHECK-LABEL: and32_imm8_br: 1181 ; CHECK: # %bb.0: # %entry 1182 ; CHECK-NEXT: andl $15, {{.*}}(%rip) # encoding: [0x83,0x25,A,A,A,A,0x0f] 1183 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 1184 ; CHECK-NEXT: je .LBB36_1 # encoding: [0x74,A] 1185 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB36_1-1, kind: FK_PCRel_1 1186 ; CHECK-NEXT: # %bb.2: # %b 1187 ; CHECK-NEXT: jmp b # TAILCALL 1188 ; CHECK-NEXT: # encoding: [0xeb,A] 1189 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1190 ; CHECK-NEXT: .LBB36_1: # %a 1191 ; CHECK-NEXT: jmp a # TAILCALL 1192 ; CHECK-NEXT: # encoding: [0xeb,A] 1193 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1194 entry: 1195 %load1 = load i32, i32* @g32 1196 %and = and i32 %load1, 15 1197 store i32 %and, i32* @g32 1198 %cond = icmp eq i32 %and, 0 1199 br i1 %cond, label %a, label %b 1200 1201 a: 1202 tail call void @a() 1203 ret void 1204 1205 b: 1206 tail call void @b() 1207 ret void 1208 } 1209 1210 define void @and32_imm8_neg_br() nounwind { 1211 ; CHECK-LABEL: and32_imm8_neg_br: 1212 ; CHECK: # %bb.0: # %entry 1213 ; CHECK-NEXT: andl $-4, {{.*}}(%rip) # encoding: [0x83,0x25,A,A,A,A,0xfc] 1214 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 1215 ; CHECK-NEXT: je .LBB37_1 # encoding: [0x74,A] 1216 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB37_1-1, kind: FK_PCRel_1 1217 ; CHECK-NEXT: # %bb.2: # %b 1218 ; CHECK-NEXT: jmp b # TAILCALL 1219 ; CHECK-NEXT: # encoding: [0xeb,A] 1220 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1221 ; CHECK-NEXT: .LBB37_1: # %a 1222 ; CHECK-NEXT: jmp a # TAILCALL 1223 ; CHECK-NEXT: # encoding: [0xeb,A] 1224 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1225 entry: 1226 %load1 = load i32, i32* @g32 1227 %and = and i32 %load1, -4 1228 store i32 %and, i32* @g32 1229 %cond = icmp eq i32 %and, 0 1230 br i1 %cond, label %a, label %b 1231 1232 a: 1233 tail call void @a() 1234 ret void 1235 1236 b: 1237 tail call void @b() 1238 ret void 1239 } 1240 1241 define void @and16_imm_br() nounwind { 1242 ; CHECK-LABEL: and16_imm_br: 1243 ; CHECK: # %bb.0: # %entry 1244 ; CHECK-NEXT: andw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x25,A,A,A,A,0x00,0x80] 1245 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte 1246 ; CHECK-NEXT: # imm = 0x8000 1247 ; CHECK-NEXT: jne .LBB38_2 # encoding: [0x75,A] 1248 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB38_2-1, kind: FK_PCRel_1 1249 ; CHECK-NEXT: # %bb.1: # %a 1250 ; CHECK-NEXT: jmp a # TAILCALL 1251 ; CHECK-NEXT: # encoding: [0xeb,A] 1252 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1253 ; CHECK-NEXT: .LBB38_2: # %b 1254 ; CHECK-NEXT: jmp b # TAILCALL 1255 ; CHECK-NEXT: # encoding: [0xeb,A] 1256 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1257 entry: 1258 %load1 = load i16, i16* @g16 1259 %and = and i16 %load1, 32768 1260 store i16 %and, i16* @g16 1261 %cond = icmp eq i16 %and, 0 1262 br i1 %cond, label %a, label %b 1263 1264 a: 1265 tail call void @a() 1266 ret void 1267 1268 b: 1269 tail call void @b() 1270 ret void 1271 } 1272 1273 define void @and16_imm8_br() nounwind { 1274 ; CHECK-LABEL: and16_imm8_br: 1275 ; CHECK: # %bb.0: # %entry 1276 ; CHECK-NEXT: andw $15, {{.*}}(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0x0f] 1277 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 1278 ; CHECK-NEXT: je .LBB39_1 # encoding: [0x74,A] 1279 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB39_1-1, kind: FK_PCRel_1 1280 ; CHECK-NEXT: # %bb.2: # %b 1281 ; CHECK-NEXT: jmp b # TAILCALL 1282 ; CHECK-NEXT: # encoding: [0xeb,A] 1283 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1284 ; CHECK-NEXT: .LBB39_1: # %a 1285 ; CHECK-NEXT: jmp a # TAILCALL 1286 ; CHECK-NEXT: # encoding: [0xeb,A] 1287 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1288 entry: 1289 %load1 = load i16, i16* @g16 1290 %and = and i16 %load1, 15 1291 store i16 %and, i16* @g16 1292 %cond = icmp eq i16 %and, 0 1293 br i1 %cond, label %a, label %b 1294 1295 a: 1296 tail call void @a() 1297 ret void 1298 1299 b: 1300 tail call void @b() 1301 ret void 1302 } 1303 1304 define void @and16_imm8_neg_br() nounwind { 1305 ; CHECK-LABEL: and16_imm8_neg_br: 1306 ; CHECK: # %bb.0: # %entry 1307 ; CHECK-NEXT: andw $-4, {{.*}}(%rip) # encoding: [0x66,0x83,0x25,A,A,A,A,0xfc] 1308 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 1309 ; CHECK-NEXT: je .LBB40_1 # encoding: [0x74,A] 1310 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB40_1-1, kind: FK_PCRel_1 1311 ; CHECK-NEXT: # %bb.2: # %b 1312 ; CHECK-NEXT: jmp b # TAILCALL 1313 ; CHECK-NEXT: # encoding: [0xeb,A] 1314 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1315 ; CHECK-NEXT: .LBB40_1: # %a 1316 ; CHECK-NEXT: jmp a # TAILCALL 1317 ; CHECK-NEXT: # encoding: [0xeb,A] 1318 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1319 entry: 1320 %load1 = load i16, i16* @g16 1321 %and = and i16 %load1, -4 1322 store i16 %and, i16* @g16 1323 %cond = icmp eq i16 %and, 0 1324 br i1 %cond, label %a, label %b 1325 1326 a: 1327 tail call void @a() 1328 ret void 1329 1330 b: 1331 tail call void @b() 1332 ret void 1333 } 1334 1335 define void @and8_imm_br() nounwind { 1336 ; CHECK-LABEL: and8_imm_br: 1337 ; CHECK: # %bb.0: # %entry 1338 ; CHECK-NEXT: andb $-4, {{.*}}(%rip) # encoding: [0x80,0x25,A,A,A,A,0xfc] 1339 ; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte 1340 ; CHECK-NEXT: je .LBB41_1 # encoding: [0x74,A] 1341 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB41_1-1, kind: FK_PCRel_1 1342 ; CHECK-NEXT: # %bb.2: # %b 1343 ; CHECK-NEXT: jmp b # TAILCALL 1344 ; CHECK-NEXT: # encoding: [0xeb,A] 1345 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1346 ; CHECK-NEXT: .LBB41_1: # %a 1347 ; CHECK-NEXT: jmp a # TAILCALL 1348 ; CHECK-NEXT: # encoding: [0xeb,A] 1349 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1350 entry: 1351 %load1 = load i8, i8* @g8 1352 %and = and i8 %load1, -4 1353 store i8 %and, i8* @g8 1354 %cond = icmp eq i8 %and, 0 1355 br i1 %cond, label %a, label %b 1356 1357 a: 1358 tail call void @a() 1359 ret void 1360 1361 b: 1362 tail call void @b() 1363 ret void 1364 } 1365 1366 define void @and64_reg_br(i64 %arg) nounwind { 1367 ; CHECK-LABEL: and64_reg_br: 1368 ; CHECK: # %bb.0: # %entry 1369 ; CHECK-NEXT: andq %rdi, {{.*}}(%rip) # encoding: [0x48,0x21,0x3d,A,A,A,A] 1370 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 1371 ; CHECK-NEXT: je .LBB42_1 # encoding: [0x74,A] 1372 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB42_1-1, kind: FK_PCRel_1 1373 ; CHECK-NEXT: # %bb.2: # %b 1374 ; CHECK-NEXT: jmp b # TAILCALL 1375 ; CHECK-NEXT: # encoding: [0xeb,A] 1376 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1377 ; CHECK-NEXT: .LBB42_1: # %a 1378 ; CHECK-NEXT: jmp a # TAILCALL 1379 ; CHECK-NEXT: # encoding: [0xeb,A] 1380 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1381 entry: 1382 %load1 = load i64, i64* @g64 1383 %and = and i64 %load1, %arg 1384 store i64 %and, i64* @g64 1385 %cond = icmp eq i64 %and, 0 1386 br i1 %cond, label %a, label %b 1387 1388 a: 1389 tail call void @a() 1390 ret void 1391 1392 b: 1393 tail call void @b() 1394 ret void 1395 } 1396 1397 define void @and32_reg_br(i32 %arg) nounwind { 1398 ; CHECK-LABEL: and32_reg_br: 1399 ; CHECK: # %bb.0: # %entry 1400 ; CHECK-NEXT: andl %edi, {{.*}}(%rip) # encoding: [0x21,0x3d,A,A,A,A] 1401 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte 1402 ; CHECK-NEXT: je .LBB43_1 # encoding: [0x74,A] 1403 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB43_1-1, kind: FK_PCRel_1 1404 ; CHECK-NEXT: # %bb.2: # %b 1405 ; CHECK-NEXT: jmp b # TAILCALL 1406 ; CHECK-NEXT: # encoding: [0xeb,A] 1407 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1408 ; CHECK-NEXT: .LBB43_1: # %a 1409 ; CHECK-NEXT: jmp a # TAILCALL 1410 ; CHECK-NEXT: # encoding: [0xeb,A] 1411 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1412 entry: 1413 %load1 = load i32, i32* @g32 1414 %and = and i32 %load1, %arg 1415 store i32 %and, i32* @g32 1416 %cond = icmp eq i32 %and, 0 1417 br i1 %cond, label %a, label %b 1418 1419 a: 1420 tail call void @a() 1421 ret void 1422 1423 b: 1424 tail call void @b() 1425 ret void 1426 } 1427 1428 define void @and16_reg_br(i16 %arg) nounwind { 1429 ; CHECK-LABEL: and16_reg_br: 1430 ; CHECK: # %bb.0: # %entry 1431 ; CHECK-NEXT: andw %di, {{.*}}(%rip) # encoding: [0x66,0x21,0x3d,A,A,A,A] 1432 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte 1433 ; CHECK-NEXT: je .LBB44_1 # encoding: [0x74,A] 1434 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB44_1-1, kind: FK_PCRel_1 1435 ; CHECK-NEXT: # %bb.2: # %b 1436 ; CHECK-NEXT: jmp b # TAILCALL 1437 ; CHECK-NEXT: # encoding: [0xeb,A] 1438 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1439 ; CHECK-NEXT: .LBB44_1: # %a 1440 ; CHECK-NEXT: jmp a # TAILCALL 1441 ; CHECK-NEXT: # encoding: [0xeb,A] 1442 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1443 entry: 1444 %load1 = load i16, i16* @g16 1445 %and = and i16 %load1, %arg 1446 store i16 %and, i16* @g16 1447 %cond = icmp eq i16 %and, 0 1448 br i1 %cond, label %a, label %b 1449 1450 a: 1451 tail call void @a() 1452 ret void 1453 1454 b: 1455 tail call void @b() 1456 ret void 1457 } 1458 1459 define void @and8_reg_br(i8 %arg) nounwind { 1460 ; CHECK-LABEL: and8_reg_br: 1461 ; CHECK: # %bb.0: # %entry 1462 ; CHECK-NEXT: andb %dil, {{.*}}(%rip) # encoding: [0x40,0x20,0x3d,A,A,A,A] 1463 ; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte 1464 ; CHECK-NEXT: je .LBB45_1 # encoding: [0x74,A] 1465 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB45_1-1, kind: FK_PCRel_1 1466 ; CHECK-NEXT: # %bb.2: # %b 1467 ; CHECK-NEXT: jmp b # TAILCALL 1468 ; CHECK-NEXT: # encoding: [0xeb,A] 1469 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1470 ; CHECK-NEXT: .LBB45_1: # %a 1471 ; CHECK-NEXT: jmp a # TAILCALL 1472 ; CHECK-NEXT: # encoding: [0xeb,A] 1473 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1474 entry: 1475 %load1 = load i8, i8* @g8 1476 %and = and i8 %load1, %arg 1477 store i8 %and, i8* @g8 1478 %cond = icmp eq i8 %and, 0 1479 br i1 %cond, label %a, label %b 1480 1481 a: 1482 tail call void @a() 1483 ret void 1484 1485 b: 1486 tail call void @b() 1487 ret void 1488 } 1489 1490 define void @or64_imm32_br() nounwind { 1491 ; CHECK-LABEL: or64_imm32_br: 1492 ; CHECK: # %bb.0: # %entry 1493 ; CHECK-NEXT: orq $16777215, {{.*}}(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0xff,0xff,0xff,0x00] 1494 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 1495 ; CHECK-NEXT: # imm = 0xFFFFFF 1496 ; CHECK-NEXT: je .LBB46_1 # encoding: [0x74,A] 1497 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB46_1-1, kind: FK_PCRel_1 1498 ; CHECK-NEXT: # %bb.2: # %b 1499 ; CHECK-NEXT: jmp b # TAILCALL 1500 ; CHECK-NEXT: # encoding: [0xeb,A] 1501 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1502 ; CHECK-NEXT: .LBB46_1: # %a 1503 ; CHECK-NEXT: jmp a # TAILCALL 1504 ; CHECK-NEXT: # encoding: [0xeb,A] 1505 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1506 entry: 1507 %load1 = load i64, i64* @g64 1508 ; Or 0x00FFFFFF, a positive immediate requiring 24-bits. 1509 %or = or i64 %load1, 16777215 1510 store i64 %or, i64* @g64 1511 %cond = icmp eq i64 %or, 0 1512 br i1 %cond, label %a, label %b 1513 1514 a: 1515 tail call void @a() 1516 ret void 1517 1518 b: 1519 tail call void @b() 1520 ret void 1521 } 1522 1523 define void @or64_sext_imm32_br() nounwind { 1524 ; CHECK-LABEL: or64_sext_imm32_br: 1525 ; CHECK: # %bb.0: # %entry 1526 ; CHECK-NEXT: orq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80] 1527 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 1528 ; CHECK-NEXT: # imm = 0x80000000 1529 ; CHECK-NEXT: je .LBB47_1 # encoding: [0x74,A] 1530 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB47_1-1, kind: FK_PCRel_1 1531 ; CHECK-NEXT: # %bb.2: # %b 1532 ; CHECK-NEXT: jmp b # TAILCALL 1533 ; CHECK-NEXT: # encoding: [0xeb,A] 1534 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1535 ; CHECK-NEXT: .LBB47_1: # %a 1536 ; CHECK-NEXT: jmp a # TAILCALL 1537 ; CHECK-NEXT: # encoding: [0xeb,A] 1538 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1539 entry: 1540 %load1 = load i64, i64* @g64 1541 ; Or -0x80000000, which requires sign-extended 32 bits. 1542 %or = or i64 %load1, -2147483648 1543 store i64 %or, i64* @g64 1544 %cond = icmp eq i64 %or, 0 1545 br i1 %cond, label %a, label %b 1546 1547 a: 1548 tail call void @a() 1549 ret void 1550 1551 b: 1552 tail call void @b() 1553 ret void 1554 } 1555 1556 define void @or64_imm8_br() nounwind { 1557 ; CHECK-LABEL: or64_imm8_br: 1558 ; CHECK: # %bb.0: # %entry 1559 ; CHECK-NEXT: orq $15, {{.*}}(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0x0f] 1560 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 1561 ; CHECK-NEXT: je .LBB48_1 # encoding: [0x74,A] 1562 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB48_1-1, kind: FK_PCRel_1 1563 ; CHECK-NEXT: # %bb.2: # %b 1564 ; CHECK-NEXT: jmp b # TAILCALL 1565 ; CHECK-NEXT: # encoding: [0xeb,A] 1566 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1567 ; CHECK-NEXT: .LBB48_1: # %a 1568 ; CHECK-NEXT: jmp a # TAILCALL 1569 ; CHECK-NEXT: # encoding: [0xeb,A] 1570 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1571 entry: 1572 %load1 = load i64, i64* @g64 1573 %or = or i64 %load1, 15 1574 store i64 %or, i64* @g64 1575 %cond = icmp eq i64 %or, 0 1576 br i1 %cond, label %a, label %b 1577 1578 a: 1579 tail call void @a() 1580 ret void 1581 1582 b: 1583 tail call void @b() 1584 ret void 1585 } 1586 1587 define void @or64_imm8_neg_br() nounwind { 1588 ; CHECK-LABEL: or64_imm8_neg_br: 1589 ; CHECK: # %bb.0: # %entry 1590 ; CHECK-NEXT: orq $-4, {{.*}}(%rip) # encoding: [0x48,0x83,0x0d,A,A,A,A,0xfc] 1591 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 1592 ; CHECK-NEXT: je .LBB49_1 # encoding: [0x74,A] 1593 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB49_1-1, kind: FK_PCRel_1 1594 ; CHECK-NEXT: # %bb.2: # %b 1595 ; CHECK-NEXT: jmp b # TAILCALL 1596 ; CHECK-NEXT: # encoding: [0xeb,A] 1597 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1598 ; CHECK-NEXT: .LBB49_1: # %a 1599 ; CHECK-NEXT: jmp a # TAILCALL 1600 ; CHECK-NEXT: # encoding: [0xeb,A] 1601 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1602 entry: 1603 %load1 = load i64, i64* @g64 1604 %or = or i64 %load1, -4 1605 store i64 %or, i64* @g64 1606 %cond = icmp eq i64 %or, 0 1607 br i1 %cond, label %a, label %b 1608 1609 a: 1610 tail call void @a() 1611 ret void 1612 1613 b: 1614 tail call void @b() 1615 ret void 1616 } 1617 1618 define void @or32_imm_br() nounwind { 1619 ; CHECK-LABEL: or32_imm_br: 1620 ; CHECK: # %bb.0: # %entry 1621 ; CHECK-NEXT: orl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x0d,A,A,A,A,0x00,0x00,0x00,0x80] 1622 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte 1623 ; CHECK-NEXT: # imm = 0x80000000 1624 ; CHECK-NEXT: je .LBB50_1 # encoding: [0x74,A] 1625 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB50_1-1, kind: FK_PCRel_1 1626 ; CHECK-NEXT: # %bb.2: # %b 1627 ; CHECK-NEXT: jmp b # TAILCALL 1628 ; CHECK-NEXT: # encoding: [0xeb,A] 1629 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1630 ; CHECK-NEXT: .LBB50_1: # %a 1631 ; CHECK-NEXT: jmp a # TAILCALL 1632 ; CHECK-NEXT: # encoding: [0xeb,A] 1633 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1634 entry: 1635 %load1 = load i32, i32* @g32 1636 ; Or 0x80000000, a positive number requiring 32 bits of immediate. 1637 %or = or i32 %load1, 2147483648 1638 store i32 %or, i32* @g32 1639 %cond = icmp eq i32 %or, 0 1640 br i1 %cond, label %a, label %b 1641 1642 a: 1643 tail call void @a() 1644 ret void 1645 1646 b: 1647 tail call void @b() 1648 ret void 1649 } 1650 1651 define void @or32_imm8_br() nounwind { 1652 ; CHECK-LABEL: or32_imm8_br: 1653 ; CHECK: # %bb.0: # %entry 1654 ; CHECK-NEXT: orl $15, {{.*}}(%rip) # encoding: [0x83,0x0d,A,A,A,A,0x0f] 1655 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 1656 ; CHECK-NEXT: je .LBB51_1 # encoding: [0x74,A] 1657 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB51_1-1, kind: FK_PCRel_1 1658 ; CHECK-NEXT: # %bb.2: # %b 1659 ; CHECK-NEXT: jmp b # TAILCALL 1660 ; CHECK-NEXT: # encoding: [0xeb,A] 1661 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1662 ; CHECK-NEXT: .LBB51_1: # %a 1663 ; CHECK-NEXT: jmp a # TAILCALL 1664 ; CHECK-NEXT: # encoding: [0xeb,A] 1665 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1666 entry: 1667 %load1 = load i32, i32* @g32 1668 %or = or i32 %load1, 15 1669 store i32 %or, i32* @g32 1670 %cond = icmp eq i32 %or, 0 1671 br i1 %cond, label %a, label %b 1672 1673 a: 1674 tail call void @a() 1675 ret void 1676 1677 b: 1678 tail call void @b() 1679 ret void 1680 } 1681 1682 define void @or32_imm8_neg_br() nounwind { 1683 ; CHECK-LABEL: or32_imm8_neg_br: 1684 ; CHECK: # %bb.0: # %entry 1685 ; CHECK-NEXT: orl $-4, {{.*}}(%rip) # encoding: [0x83,0x0d,A,A,A,A,0xfc] 1686 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 1687 ; CHECK-NEXT: je .LBB52_1 # encoding: [0x74,A] 1688 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB52_1-1, kind: FK_PCRel_1 1689 ; CHECK-NEXT: # %bb.2: # %b 1690 ; CHECK-NEXT: jmp b # TAILCALL 1691 ; CHECK-NEXT: # encoding: [0xeb,A] 1692 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1693 ; CHECK-NEXT: .LBB52_1: # %a 1694 ; CHECK-NEXT: jmp a # TAILCALL 1695 ; CHECK-NEXT: # encoding: [0xeb,A] 1696 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1697 entry: 1698 %load1 = load i32, i32* @g32 1699 %or = or i32 %load1, -4 1700 store i32 %or, i32* @g32 1701 %cond = icmp eq i32 %or, 0 1702 br i1 %cond, label %a, label %b 1703 1704 a: 1705 tail call void @a() 1706 ret void 1707 1708 b: 1709 tail call void @b() 1710 ret void 1711 } 1712 1713 define void @or16_imm_br() nounwind { 1714 ; CHECK-LABEL: or16_imm_br: 1715 ; CHECK: # %bb.0: # %entry 1716 ; CHECK-NEXT: orw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x0d,A,A,A,A,0x00,0x80] 1717 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte 1718 ; CHECK-NEXT: # imm = 0x8000 1719 ; CHECK-NEXT: je .LBB53_1 # encoding: [0x74,A] 1720 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB53_1-1, kind: FK_PCRel_1 1721 ; CHECK-NEXT: # %bb.2: # %b 1722 ; CHECK-NEXT: jmp b # TAILCALL 1723 ; CHECK-NEXT: # encoding: [0xeb,A] 1724 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1725 ; CHECK-NEXT: .LBB53_1: # %a 1726 ; CHECK-NEXT: jmp a # TAILCALL 1727 ; CHECK-NEXT: # encoding: [0xeb,A] 1728 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1729 entry: 1730 %load1 = load i16, i16* @g16 1731 %or = or i16 %load1, 32768 1732 store i16 %or, i16* @g16 1733 %cond = icmp eq i16 %or, 0 1734 br i1 %cond, label %a, label %b 1735 1736 a: 1737 tail call void @a() 1738 ret void 1739 1740 b: 1741 tail call void @b() 1742 ret void 1743 } 1744 1745 define void @or16_imm8_br() nounwind { 1746 ; CHECK-LABEL: or16_imm8_br: 1747 ; CHECK: # %bb.0: # %entry 1748 ; CHECK-NEXT: orw $15, {{.*}}(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0x0f] 1749 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 1750 ; CHECK-NEXT: je .LBB54_1 # encoding: [0x74,A] 1751 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB54_1-1, kind: FK_PCRel_1 1752 ; CHECK-NEXT: # %bb.2: # %b 1753 ; CHECK-NEXT: jmp b # TAILCALL 1754 ; CHECK-NEXT: # encoding: [0xeb,A] 1755 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1756 ; CHECK-NEXT: .LBB54_1: # %a 1757 ; CHECK-NEXT: jmp a # TAILCALL 1758 ; CHECK-NEXT: # encoding: [0xeb,A] 1759 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1760 entry: 1761 %load1 = load i16, i16* @g16 1762 %or = or i16 %load1, 15 1763 store i16 %or, i16* @g16 1764 %cond = icmp eq i16 %or, 0 1765 br i1 %cond, label %a, label %b 1766 1767 a: 1768 tail call void @a() 1769 ret void 1770 1771 b: 1772 tail call void @b() 1773 ret void 1774 } 1775 1776 define void @or16_imm8_neg_br() nounwind { 1777 ; CHECK-LABEL: or16_imm8_neg_br: 1778 ; CHECK: # %bb.0: # %entry 1779 ; CHECK-NEXT: orw $-4, {{.*}}(%rip) # encoding: [0x66,0x83,0x0d,A,A,A,A,0xfc] 1780 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 1781 ; CHECK-NEXT: je .LBB55_1 # encoding: [0x74,A] 1782 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB55_1-1, kind: FK_PCRel_1 1783 ; CHECK-NEXT: # %bb.2: # %b 1784 ; CHECK-NEXT: jmp b # TAILCALL 1785 ; CHECK-NEXT: # encoding: [0xeb,A] 1786 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1787 ; CHECK-NEXT: .LBB55_1: # %a 1788 ; CHECK-NEXT: jmp a # TAILCALL 1789 ; CHECK-NEXT: # encoding: [0xeb,A] 1790 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1791 entry: 1792 %load1 = load i16, i16* @g16 1793 %or = or i16 %load1, -4 1794 store i16 %or, i16* @g16 1795 %cond = icmp eq i16 %or, 0 1796 br i1 %cond, label %a, label %b 1797 1798 a: 1799 tail call void @a() 1800 ret void 1801 1802 b: 1803 tail call void @b() 1804 ret void 1805 } 1806 1807 define void @or8_imm_br() nounwind { 1808 ; CHECK-LABEL: or8_imm_br: 1809 ; CHECK: # %bb.0: # %entry 1810 ; CHECK-NEXT: orb $-4, {{.*}}(%rip) # encoding: [0x80,0x0d,A,A,A,A,0xfc] 1811 ; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte 1812 ; CHECK-NEXT: je .LBB56_1 # encoding: [0x74,A] 1813 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB56_1-1, kind: FK_PCRel_1 1814 ; CHECK-NEXT: # %bb.2: # %b 1815 ; CHECK-NEXT: jmp b # TAILCALL 1816 ; CHECK-NEXT: # encoding: [0xeb,A] 1817 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1818 ; CHECK-NEXT: .LBB56_1: # %a 1819 ; CHECK-NEXT: jmp a # TAILCALL 1820 ; CHECK-NEXT: # encoding: [0xeb,A] 1821 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1822 entry: 1823 %load1 = load i8, i8* @g8 1824 %or = or i8 %load1, -4 1825 store i8 %or, i8* @g8 1826 %cond = icmp eq i8 %or, 0 1827 br i1 %cond, label %a, label %b 1828 1829 a: 1830 tail call void @a() 1831 ret void 1832 1833 b: 1834 tail call void @b() 1835 ret void 1836 } 1837 1838 define void @or64_reg_br(i64 %arg) nounwind { 1839 ; CHECK-LABEL: or64_reg_br: 1840 ; CHECK: # %bb.0: # %entry 1841 ; CHECK-NEXT: orq %rdi, {{.*}}(%rip) # encoding: [0x48,0x09,0x3d,A,A,A,A] 1842 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 1843 ; CHECK-NEXT: je .LBB57_1 # encoding: [0x74,A] 1844 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB57_1-1, kind: FK_PCRel_1 1845 ; CHECK-NEXT: # %bb.2: # %b 1846 ; CHECK-NEXT: jmp b # TAILCALL 1847 ; CHECK-NEXT: # encoding: [0xeb,A] 1848 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1849 ; CHECK-NEXT: .LBB57_1: # %a 1850 ; CHECK-NEXT: jmp a # TAILCALL 1851 ; CHECK-NEXT: # encoding: [0xeb,A] 1852 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1853 entry: 1854 %load1 = load i64, i64* @g64 1855 %or = or i64 %load1, %arg 1856 store i64 %or, i64* @g64 1857 %cond = icmp eq i64 %or, 0 1858 br i1 %cond, label %a, label %b 1859 1860 a: 1861 tail call void @a() 1862 ret void 1863 1864 b: 1865 tail call void @b() 1866 ret void 1867 } 1868 1869 define void @or32_reg_br(i32 %arg) nounwind { 1870 ; CHECK-LABEL: or32_reg_br: 1871 ; CHECK: # %bb.0: # %entry 1872 ; CHECK-NEXT: orl %edi, {{.*}}(%rip) # encoding: [0x09,0x3d,A,A,A,A] 1873 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte 1874 ; CHECK-NEXT: je .LBB58_1 # encoding: [0x74,A] 1875 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB58_1-1, kind: FK_PCRel_1 1876 ; CHECK-NEXT: # %bb.2: # %b 1877 ; CHECK-NEXT: jmp b # TAILCALL 1878 ; CHECK-NEXT: # encoding: [0xeb,A] 1879 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1880 ; CHECK-NEXT: .LBB58_1: # %a 1881 ; CHECK-NEXT: jmp a # TAILCALL 1882 ; CHECK-NEXT: # encoding: [0xeb,A] 1883 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1884 entry: 1885 %load1 = load i32, i32* @g32 1886 %or = or i32 %load1, %arg 1887 store i32 %or, i32* @g32 1888 %cond = icmp eq i32 %or, 0 1889 br i1 %cond, label %a, label %b 1890 1891 a: 1892 tail call void @a() 1893 ret void 1894 1895 b: 1896 tail call void @b() 1897 ret void 1898 } 1899 1900 define void @or16_reg_br(i16 %arg) nounwind { 1901 ; CHECK-LABEL: or16_reg_br: 1902 ; CHECK: # %bb.0: # %entry 1903 ; CHECK-NEXT: orw %di, {{.*}}(%rip) # encoding: [0x66,0x09,0x3d,A,A,A,A] 1904 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte 1905 ; CHECK-NEXT: je .LBB59_1 # encoding: [0x74,A] 1906 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB59_1-1, kind: FK_PCRel_1 1907 ; CHECK-NEXT: # %bb.2: # %b 1908 ; CHECK-NEXT: jmp b # TAILCALL 1909 ; CHECK-NEXT: # encoding: [0xeb,A] 1910 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1911 ; CHECK-NEXT: .LBB59_1: # %a 1912 ; CHECK-NEXT: jmp a # TAILCALL 1913 ; CHECK-NEXT: # encoding: [0xeb,A] 1914 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1915 entry: 1916 %load1 = load i16, i16* @g16 1917 %or = or i16 %load1, %arg 1918 store i16 %or, i16* @g16 1919 %cond = icmp eq i16 %or, 0 1920 br i1 %cond, label %a, label %b 1921 1922 a: 1923 tail call void @a() 1924 ret void 1925 1926 b: 1927 tail call void @b() 1928 ret void 1929 } 1930 1931 define void @or8_reg_br(i8 %arg) nounwind { 1932 ; CHECK-LABEL: or8_reg_br: 1933 ; CHECK: # %bb.0: # %entry 1934 ; CHECK-NEXT: orb %dil, {{.*}}(%rip) # encoding: [0x40,0x08,0x3d,A,A,A,A] 1935 ; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte 1936 ; CHECK-NEXT: je .LBB60_1 # encoding: [0x74,A] 1937 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB60_1-1, kind: FK_PCRel_1 1938 ; CHECK-NEXT: # %bb.2: # %b 1939 ; CHECK-NEXT: jmp b # TAILCALL 1940 ; CHECK-NEXT: # encoding: [0xeb,A] 1941 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1942 ; CHECK-NEXT: .LBB60_1: # %a 1943 ; CHECK-NEXT: jmp a # TAILCALL 1944 ; CHECK-NEXT: # encoding: [0xeb,A] 1945 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1946 entry: 1947 %load1 = load i8, i8* @g8 1948 %or = or i8 %load1, %arg 1949 store i8 %or, i8* @g8 1950 %cond = icmp eq i8 %or, 0 1951 br i1 %cond, label %a, label %b 1952 1953 a: 1954 tail call void @a() 1955 ret void 1956 1957 b: 1958 tail call void @b() 1959 ret void 1960 } 1961 1962 define void @xor64_imm32_br() nounwind { 1963 ; CHECK-LABEL: xor64_imm32_br: 1964 ; CHECK: # %bb.0: # %entry 1965 ; CHECK-NEXT: xorq $16777215, {{.*}}(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0xff,0xff,0xff,0x00] 1966 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 1967 ; CHECK-NEXT: # imm = 0xFFFFFF 1968 ; CHECK-NEXT: je .LBB61_1 # encoding: [0x74,A] 1969 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB61_1-1, kind: FK_PCRel_1 1970 ; CHECK-NEXT: # %bb.2: # %b 1971 ; CHECK-NEXT: jmp b # TAILCALL 1972 ; CHECK-NEXT: # encoding: [0xeb,A] 1973 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 1974 ; CHECK-NEXT: .LBB61_1: # %a 1975 ; CHECK-NEXT: jmp a # TAILCALL 1976 ; CHECK-NEXT: # encoding: [0xeb,A] 1977 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 1978 entry: 1979 %load1 = load i64, i64* @g64 1980 ; Xor 0x00FFFFFF, a positive immediate requiring 24-bits. 1981 %xor = xor i64 %load1, 16777215 1982 store i64 %xor, i64* @g64 1983 %cond = icmp eq i64 %xor, 0 1984 br i1 %cond, label %a, label %b 1985 1986 a: 1987 tail call void @a() 1988 ret void 1989 1990 b: 1991 tail call void @b() 1992 ret void 1993 } 1994 1995 define void @xor64_sext_imm32_br() nounwind { 1996 ; CHECK-LABEL: xor64_sext_imm32_br: 1997 ; CHECK: # %bb.0: # %entry 1998 ; CHECK-NEXT: xorq $-2147483648, {{.*}}(%rip) # encoding: [0x48,0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80] 1999 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-8, kind: reloc_riprel_4byte 2000 ; CHECK-NEXT: # imm = 0x80000000 2001 ; CHECK-NEXT: je .LBB62_1 # encoding: [0x74,A] 2002 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB62_1-1, kind: FK_PCRel_1 2003 ; CHECK-NEXT: # %bb.2: # %b 2004 ; CHECK-NEXT: jmp b # TAILCALL 2005 ; CHECK-NEXT: # encoding: [0xeb,A] 2006 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2007 ; CHECK-NEXT: .LBB62_1: # %a 2008 ; CHECK-NEXT: jmp a # TAILCALL 2009 ; CHECK-NEXT: # encoding: [0xeb,A] 2010 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2011 entry: 2012 %load1 = load i64, i64* @g64 2013 ; Xor -0x80000000, which requires sign-extended 32 bits. 2014 %xor = xor i64 %load1, -2147483648 2015 store i64 %xor, i64* @g64 2016 %cond = icmp eq i64 %xor, 0 2017 br i1 %cond, label %a, label %b 2018 2019 a: 2020 tail call void @a() 2021 ret void 2022 2023 b: 2024 tail call void @b() 2025 ret void 2026 } 2027 2028 define void @xor64_imm8_br() nounwind { 2029 ; CHECK-LABEL: xor64_imm8_br: 2030 ; CHECK: # %bb.0: # %entry 2031 ; CHECK-NEXT: xorq $15, {{.*}}(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0x0f] 2032 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 2033 ; CHECK-NEXT: je .LBB63_1 # encoding: [0x74,A] 2034 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB63_1-1, kind: FK_PCRel_1 2035 ; CHECK-NEXT: # %bb.2: # %b 2036 ; CHECK-NEXT: jmp b # TAILCALL 2037 ; CHECK-NEXT: # encoding: [0xeb,A] 2038 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2039 ; CHECK-NEXT: .LBB63_1: # %a 2040 ; CHECK-NEXT: jmp a # TAILCALL 2041 ; CHECK-NEXT: # encoding: [0xeb,A] 2042 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2043 entry: 2044 %load1 = load i64, i64* @g64 2045 %xor = xor i64 %load1, 15 2046 store i64 %xor, i64* @g64 2047 %cond = icmp eq i64 %xor, 0 2048 br i1 %cond, label %a, label %b 2049 2050 a: 2051 tail call void @a() 2052 ret void 2053 2054 b: 2055 tail call void @b() 2056 ret void 2057 } 2058 2059 define void @xor64_imm8_neg_br() nounwind { 2060 ; CHECK-LABEL: xor64_imm8_neg_br: 2061 ; CHECK: # %bb.0: # %entry 2062 ; CHECK-NEXT: xorq $-4, {{.*}}(%rip) # encoding: [0x48,0x83,0x35,A,A,A,A,0xfc] 2063 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-5, kind: reloc_riprel_4byte 2064 ; CHECK-NEXT: je .LBB64_1 # encoding: [0x74,A] 2065 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB64_1-1, kind: FK_PCRel_1 2066 ; CHECK-NEXT: # %bb.2: # %b 2067 ; CHECK-NEXT: jmp b # TAILCALL 2068 ; CHECK-NEXT: # encoding: [0xeb,A] 2069 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2070 ; CHECK-NEXT: .LBB64_1: # %a 2071 ; CHECK-NEXT: jmp a # TAILCALL 2072 ; CHECK-NEXT: # encoding: [0xeb,A] 2073 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2074 entry: 2075 %load1 = load i64, i64* @g64 2076 %xor = xor i64 %load1, -4 2077 store i64 %xor, i64* @g64 2078 %cond = icmp eq i64 %xor, 0 2079 br i1 %cond, label %a, label %b 2080 2081 a: 2082 tail call void @a() 2083 ret void 2084 2085 b: 2086 tail call void @b() 2087 ret void 2088 } 2089 2090 define void @xor32_imm_br() nounwind { 2091 ; CHECK-LABEL: xor32_imm_br: 2092 ; CHECK: # %bb.0: # %entry 2093 ; CHECK-NEXT: xorl $-2147483648, {{.*}}(%rip) # encoding: [0x81,0x35,A,A,A,A,0x00,0x00,0x00,0x80] 2094 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-8, kind: reloc_riprel_4byte 2095 ; CHECK-NEXT: # imm = 0x80000000 2096 ; CHECK-NEXT: je .LBB65_1 # encoding: [0x74,A] 2097 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB65_1-1, kind: FK_PCRel_1 2098 ; CHECK-NEXT: # %bb.2: # %b 2099 ; CHECK-NEXT: jmp b # TAILCALL 2100 ; CHECK-NEXT: # encoding: [0xeb,A] 2101 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2102 ; CHECK-NEXT: .LBB65_1: # %a 2103 ; CHECK-NEXT: jmp a # TAILCALL 2104 ; CHECK-NEXT: # encoding: [0xeb,A] 2105 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2106 entry: 2107 %load1 = load i32, i32* @g32 2108 ; Xor 0x80000000, a positive number requiring 32 bits of immediate. 2109 %xor = xor i32 %load1, 2147483648 2110 store i32 %xor, i32* @g32 2111 %cond = icmp eq i32 %xor, 0 2112 br i1 %cond, label %a, label %b 2113 2114 a: 2115 tail call void @a() 2116 ret void 2117 2118 b: 2119 tail call void @b() 2120 ret void 2121 } 2122 2123 define void @xor32_imm8_br() nounwind { 2124 ; CHECK-LABEL: xor32_imm8_br: 2125 ; CHECK: # %bb.0: # %entry 2126 ; CHECK-NEXT: xorl $15, {{.*}}(%rip) # encoding: [0x83,0x35,A,A,A,A,0x0f] 2127 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 2128 ; CHECK-NEXT: je .LBB66_1 # encoding: [0x74,A] 2129 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB66_1-1, kind: FK_PCRel_1 2130 ; CHECK-NEXT: # %bb.2: # %b 2131 ; CHECK-NEXT: jmp b # TAILCALL 2132 ; CHECK-NEXT: # encoding: [0xeb,A] 2133 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2134 ; CHECK-NEXT: .LBB66_1: # %a 2135 ; CHECK-NEXT: jmp a # TAILCALL 2136 ; CHECK-NEXT: # encoding: [0xeb,A] 2137 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2138 entry: 2139 %load1 = load i32, i32* @g32 2140 %xor = xor i32 %load1, 15 2141 store i32 %xor, i32* @g32 2142 %cond = icmp eq i32 %xor, 0 2143 br i1 %cond, label %a, label %b 2144 2145 a: 2146 tail call void @a() 2147 ret void 2148 2149 b: 2150 tail call void @b() 2151 ret void 2152 } 2153 2154 define void @xor32_imm8_neg_br() nounwind { 2155 ; CHECK-LABEL: xor32_imm8_neg_br: 2156 ; CHECK: # %bb.0: # %entry 2157 ; CHECK-NEXT: xorl $-4, {{.*}}(%rip) # encoding: [0x83,0x35,A,A,A,A,0xfc] 2158 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-5, kind: reloc_riprel_4byte 2159 ; CHECK-NEXT: je .LBB67_1 # encoding: [0x74,A] 2160 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB67_1-1, kind: FK_PCRel_1 2161 ; CHECK-NEXT: # %bb.2: # %b 2162 ; CHECK-NEXT: jmp b # TAILCALL 2163 ; CHECK-NEXT: # encoding: [0xeb,A] 2164 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2165 ; CHECK-NEXT: .LBB67_1: # %a 2166 ; CHECK-NEXT: jmp a # TAILCALL 2167 ; CHECK-NEXT: # encoding: [0xeb,A] 2168 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2169 entry: 2170 %load1 = load i32, i32* @g32 2171 %xor = xor i32 %load1, -4 2172 store i32 %xor, i32* @g32 2173 %cond = icmp eq i32 %xor, 0 2174 br i1 %cond, label %a, label %b 2175 2176 a: 2177 tail call void @a() 2178 ret void 2179 2180 b: 2181 tail call void @b() 2182 ret void 2183 } 2184 2185 define void @xor16_imm_br() nounwind { 2186 ; CHECK-LABEL: xor16_imm_br: 2187 ; CHECK: # %bb.0: # %entry 2188 ; CHECK-NEXT: xorw $-32768, {{.*}}(%rip) # encoding: [0x66,0x81,0x35,A,A,A,A,0x00,0x80] 2189 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-6, kind: reloc_riprel_4byte 2190 ; CHECK-NEXT: # imm = 0x8000 2191 ; CHECK-NEXT: je .LBB68_1 # encoding: [0x74,A] 2192 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB68_1-1, kind: FK_PCRel_1 2193 ; CHECK-NEXT: # %bb.2: # %b 2194 ; CHECK-NEXT: jmp b # TAILCALL 2195 ; CHECK-NEXT: # encoding: [0xeb,A] 2196 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2197 ; CHECK-NEXT: .LBB68_1: # %a 2198 ; CHECK-NEXT: jmp a # TAILCALL 2199 ; CHECK-NEXT: # encoding: [0xeb,A] 2200 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2201 entry: 2202 %load1 = load i16, i16* @g16 2203 %xor = xor i16 %load1, 32768 2204 store i16 %xor, i16* @g16 2205 %cond = icmp eq i16 %xor, 0 2206 br i1 %cond, label %a, label %b 2207 2208 a: 2209 tail call void @a() 2210 ret void 2211 2212 b: 2213 tail call void @b() 2214 ret void 2215 } 2216 2217 define void @xor16_imm8_br() nounwind { 2218 ; CHECK-LABEL: xor16_imm8_br: 2219 ; CHECK: # %bb.0: # %entry 2220 ; CHECK-NEXT: xorw $15, {{.*}}(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0x0f] 2221 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 2222 ; CHECK-NEXT: je .LBB69_1 # encoding: [0x74,A] 2223 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB69_1-1, kind: FK_PCRel_1 2224 ; CHECK-NEXT: # %bb.2: # %b 2225 ; CHECK-NEXT: jmp b # TAILCALL 2226 ; CHECK-NEXT: # encoding: [0xeb,A] 2227 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2228 ; CHECK-NEXT: .LBB69_1: # %a 2229 ; CHECK-NEXT: jmp a # TAILCALL 2230 ; CHECK-NEXT: # encoding: [0xeb,A] 2231 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2232 entry: 2233 %load1 = load i16, i16* @g16 2234 %xor = xor i16 %load1, 15 2235 store i16 %xor, i16* @g16 2236 %cond = icmp eq i16 %xor, 0 2237 br i1 %cond, label %a, label %b 2238 2239 a: 2240 tail call void @a() 2241 ret void 2242 2243 b: 2244 tail call void @b() 2245 ret void 2246 } 2247 2248 define void @xor16_imm8_neg_br() nounwind { 2249 ; CHECK-LABEL: xor16_imm8_neg_br: 2250 ; CHECK: # %bb.0: # %entry 2251 ; CHECK-NEXT: xorw $-4, {{.*}}(%rip) # encoding: [0x66,0x83,0x35,A,A,A,A,0xfc] 2252 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-5, kind: reloc_riprel_4byte 2253 ; CHECK-NEXT: je .LBB70_1 # encoding: [0x74,A] 2254 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB70_1-1, kind: FK_PCRel_1 2255 ; CHECK-NEXT: # %bb.2: # %b 2256 ; CHECK-NEXT: jmp b # TAILCALL 2257 ; CHECK-NEXT: # encoding: [0xeb,A] 2258 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2259 ; CHECK-NEXT: .LBB70_1: # %a 2260 ; CHECK-NEXT: jmp a # TAILCALL 2261 ; CHECK-NEXT: # encoding: [0xeb,A] 2262 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2263 entry: 2264 %load1 = load i16, i16* @g16 2265 %xor = xor i16 %load1, -4 2266 store i16 %xor, i16* @g16 2267 %cond = icmp eq i16 %xor, 0 2268 br i1 %cond, label %a, label %b 2269 2270 a: 2271 tail call void @a() 2272 ret void 2273 2274 b: 2275 tail call void @b() 2276 ret void 2277 } 2278 2279 define void @xor8_imm_br() nounwind { 2280 ; CHECK-LABEL: xor8_imm_br: 2281 ; CHECK: # %bb.0: # %entry 2282 ; CHECK-NEXT: xorb $-4, {{.*}}(%rip) # encoding: [0x80,0x35,A,A,A,A,0xfc] 2283 ; CHECK-NEXT: # fixup A - offset: 2, value: g8-5, kind: reloc_riprel_4byte 2284 ; CHECK-NEXT: je .LBB71_1 # encoding: [0x74,A] 2285 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB71_1-1, kind: FK_PCRel_1 2286 ; CHECK-NEXT: # %bb.2: # %b 2287 ; CHECK-NEXT: jmp b # TAILCALL 2288 ; CHECK-NEXT: # encoding: [0xeb,A] 2289 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2290 ; CHECK-NEXT: .LBB71_1: # %a 2291 ; CHECK-NEXT: jmp a # TAILCALL 2292 ; CHECK-NEXT: # encoding: [0xeb,A] 2293 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2294 entry: 2295 %load1 = load i8, i8* @g8 2296 %xor = xor i8 %load1, -4 2297 store i8 %xor, i8* @g8 2298 %cond = icmp eq i8 %xor, 0 2299 br i1 %cond, label %a, label %b 2300 2301 a: 2302 tail call void @a() 2303 ret void 2304 2305 b: 2306 tail call void @b() 2307 ret void 2308 } 2309 2310 define void @xor64_reg_br(i64 %arg) nounwind { 2311 ; CHECK-LABEL: xor64_reg_br: 2312 ; CHECK: # %bb.0: # %entry 2313 ; CHECK-NEXT: xorq %rdi, {{.*}}(%rip) # encoding: [0x48,0x31,0x3d,A,A,A,A] 2314 ; CHECK-NEXT: # fixup A - offset: 3, value: g64-4, kind: reloc_riprel_4byte 2315 ; CHECK-NEXT: je .LBB72_1 # encoding: [0x74,A] 2316 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB72_1-1, kind: FK_PCRel_1 2317 ; CHECK-NEXT: # %bb.2: # %b 2318 ; CHECK-NEXT: jmp b # TAILCALL 2319 ; CHECK-NEXT: # encoding: [0xeb,A] 2320 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2321 ; CHECK-NEXT: .LBB72_1: # %a 2322 ; CHECK-NEXT: jmp a # TAILCALL 2323 ; CHECK-NEXT: # encoding: [0xeb,A] 2324 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2325 entry: 2326 %load1 = load i64, i64* @g64 2327 %xor = xor i64 %load1, %arg 2328 store i64 %xor, i64* @g64 2329 %cond = icmp eq i64 %xor, 0 2330 br i1 %cond, label %a, label %b 2331 2332 a: 2333 tail call void @a() 2334 ret void 2335 2336 b: 2337 tail call void @b() 2338 ret void 2339 } 2340 2341 define void @xor32_reg_br(i32 %arg) nounwind { 2342 ; CHECK-LABEL: xor32_reg_br: 2343 ; CHECK: # %bb.0: # %entry 2344 ; CHECK-NEXT: xorl %edi, {{.*}}(%rip) # encoding: [0x31,0x3d,A,A,A,A] 2345 ; CHECK-NEXT: # fixup A - offset: 2, value: g32-4, kind: reloc_riprel_4byte 2346 ; CHECK-NEXT: je .LBB73_1 # encoding: [0x74,A] 2347 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB73_1-1, kind: FK_PCRel_1 2348 ; CHECK-NEXT: # %bb.2: # %b 2349 ; CHECK-NEXT: jmp b # TAILCALL 2350 ; CHECK-NEXT: # encoding: [0xeb,A] 2351 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2352 ; CHECK-NEXT: .LBB73_1: # %a 2353 ; CHECK-NEXT: jmp a # TAILCALL 2354 ; CHECK-NEXT: # encoding: [0xeb,A] 2355 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2356 entry: 2357 %load1 = load i32, i32* @g32 2358 %xor = xor i32 %load1, %arg 2359 store i32 %xor, i32* @g32 2360 %cond = icmp eq i32 %xor, 0 2361 br i1 %cond, label %a, label %b 2362 2363 a: 2364 tail call void @a() 2365 ret void 2366 2367 b: 2368 tail call void @b() 2369 ret void 2370 } 2371 2372 define void @xor16_reg_br(i16 %arg) nounwind { 2373 ; CHECK-LABEL: xor16_reg_br: 2374 ; CHECK: # %bb.0: # %entry 2375 ; CHECK-NEXT: xorw %di, {{.*}}(%rip) # encoding: [0x66,0x31,0x3d,A,A,A,A] 2376 ; CHECK-NEXT: # fixup A - offset: 3, value: g16-4, kind: reloc_riprel_4byte 2377 ; CHECK-NEXT: je .LBB74_1 # encoding: [0x74,A] 2378 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB74_1-1, kind: FK_PCRel_1 2379 ; CHECK-NEXT: # %bb.2: # %b 2380 ; CHECK-NEXT: jmp b # TAILCALL 2381 ; CHECK-NEXT: # encoding: [0xeb,A] 2382 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2383 ; CHECK-NEXT: .LBB74_1: # %a 2384 ; CHECK-NEXT: jmp a # TAILCALL 2385 ; CHECK-NEXT: # encoding: [0xeb,A] 2386 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2387 entry: 2388 %load1 = load i16, i16* @g16 2389 %xor = xor i16 %load1, %arg 2390 store i16 %xor, i16* @g16 2391 %cond = icmp eq i16 %xor, 0 2392 br i1 %cond, label %a, label %b 2393 2394 a: 2395 tail call void @a() 2396 ret void 2397 2398 b: 2399 tail call void @b() 2400 ret void 2401 } 2402 2403 define void @xor8_reg_br(i8 %arg) nounwind { 2404 ; CHECK-LABEL: xor8_reg_br: 2405 ; CHECK: # %bb.0: # %entry 2406 ; CHECK-NEXT: xorb %dil, {{.*}}(%rip) # encoding: [0x40,0x30,0x3d,A,A,A,A] 2407 ; CHECK-NEXT: # fixup A - offset: 3, value: g8-4, kind: reloc_riprel_4byte 2408 ; CHECK-NEXT: je .LBB75_1 # encoding: [0x74,A] 2409 ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB75_1-1, kind: FK_PCRel_1 2410 ; CHECK-NEXT: # %bb.2: # %b 2411 ; CHECK-NEXT: jmp b # TAILCALL 2412 ; CHECK-NEXT: # encoding: [0xeb,A] 2413 ; CHECK-NEXT: # fixup A - offset: 1, value: b-1, kind: FK_PCRel_1 2414 ; CHECK-NEXT: .LBB75_1: # %a 2415 ; CHECK-NEXT: jmp a # TAILCALL 2416 ; CHECK-NEXT: # encoding: [0xeb,A] 2417 ; CHECK-NEXT: # fixup A - offset: 1, value: a-1, kind: FK_PCRel_1 2418 entry: 2419 %load1 = load i8, i8* @g8 2420 %xor = xor i8 %load1, %arg 2421 store i8 %xor, i8* @g8 2422 %cond = icmp eq i8 %xor, 0 2423 br i1 %cond, label %a, label %b 2424 2425 a: 2426 tail call void @a() 2427 ret void 2428 2429 b: 2430 tail call void @b() 2431 ret void 2432 } 2433