1028eb436SSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2028eb436SSanjay Patel; RUN: llc < %s -verify-machineinstrs -mtriple=x86_64-- | FileCheck %s 3028eb436SSanjay Patel 4028eb436SSanjay Pateldefine i64 @select_consts_i64(i64 %offset, i32 %x) { 5028eb436SSanjay Patel; CHECK-LABEL: select_consts_i64: 6028eb436SSanjay Patel; CHECK: # %bb.0: 7f060aa1cSSanjay Patel; CHECK-NEXT: leaq 42(%rdi), %rax 8028eb436SSanjay Patel; CHECK-NEXT: testl %esi, %esi 9f060aa1cSSanjay Patel; CHECK-NEXT: cmovneq %rdi, %rax 10028eb436SSanjay Patel; CHECK-NEXT: retq 11028eb436SSanjay Patel %b = icmp eq i32 %x, 0 12028eb436SSanjay Patel %s = select i1 %b, i64 42, i64 0 13028eb436SSanjay Patel %r = add i64 %s, %offset 14028eb436SSanjay Patel ret i64 %r 15028eb436SSanjay Patel} 16028eb436SSanjay Patel 17937e7c60SSanjay Pateldefine i64 @select_consts_big_i64(i64 %offset, i32 %x) { 18937e7c60SSanjay Patel; CHECK-LABEL: select_consts_big_i64: 19937e7c60SSanjay Patel; CHECK: # %bb.0: 20937e7c60SSanjay Patel; CHECK-NEXT: movabsq $42000000000, %rax # imm = 0x9C7652400 21937e7c60SSanjay Patel; CHECK-NEXT: addq %rdi, %rax 22937e7c60SSanjay Patel; CHECK-NEXT: testl %esi, %esi 23937e7c60SSanjay Patel; CHECK-NEXT: cmovneq %rdi, %rax 24937e7c60SSanjay Patel; CHECK-NEXT: retq 25937e7c60SSanjay Patel %b = icmp eq i32 %x, 0 26937e7c60SSanjay Patel %s = select i1 %b, i64 42000000000, i64 0 27937e7c60SSanjay Patel %r = add i64 %s, %offset 28937e7c60SSanjay Patel ret i64 %r 29937e7c60SSanjay Patel} 30937e7c60SSanjay Patel 31028eb436SSanjay Pateldefine i32 @select_consts_i32(i32 %offset, i64 %x) { 32028eb436SSanjay Patel; CHECK-LABEL: select_consts_i32: 33028eb436SSanjay Patel; CHECK: # %bb.0: 34f060aa1cSSanjay Patel; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 35f060aa1cSSanjay Patel; CHECK-NEXT: leal 43(%rdi), %eax 36028eb436SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 37f060aa1cSSanjay Patel; CHECK-NEXT: cmovgel %edi, %eax 38028eb436SSanjay Patel; CHECK-NEXT: retq 39028eb436SSanjay Patel %b = icmp sgt i64 %x, 41 40028eb436SSanjay Patel %s = select i1 %b, i32 0, i32 43 41028eb436SSanjay Patel %r = add i32 %offset, %s 42028eb436SSanjay Patel ret i32 %r 43028eb436SSanjay Patel} 44028eb436SSanjay Patel 45028eb436SSanjay Pateldefine i16 @select_consts_i16(i16 %offset, i1 %b) { 46028eb436SSanjay Patel; CHECK-LABEL: select_consts_i16: 47028eb436SSanjay Patel; CHECK: # %bb.0: 48f060aa1cSSanjay Patel; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 49f060aa1cSSanjay Patel; CHECK-NEXT: leal 44(%rdi), %eax 50028eb436SSanjay Patel; CHECK-NEXT: testb $1, %sil 51f060aa1cSSanjay Patel; CHECK-NEXT: cmovel %edi, %eax 52028eb436SSanjay Patel; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 53028eb436SSanjay Patel; CHECK-NEXT: retq 54028eb436SSanjay Patel %s = select i1 %b, i16 44, i16 0 55028eb436SSanjay Patel %r = add i16 %s, %offset 56028eb436SSanjay Patel ret i16 %r 57028eb436SSanjay Patel} 58028eb436SSanjay Patel 59028eb436SSanjay Pateldefine i8 @select_consts_i8(i8 %offset, i1 %b) { 60028eb436SSanjay Patel; CHECK-LABEL: select_consts_i8: 61028eb436SSanjay Patel; CHECK: # %bb.0: 62028eb436SSanjay Patel; CHECK-NEXT: xorl %ecx, %ecx 63028eb436SSanjay Patel; CHECK-NEXT: testb $1, %sil 64028eb436SSanjay Patel; CHECK-NEXT: movl $45, %eax 65028eb436SSanjay Patel; CHECK-NEXT: cmovnel %ecx, %eax 66028eb436SSanjay Patel; CHECK-NEXT: addb %dil, %al 67028eb436SSanjay Patel; CHECK-NEXT: # kill: def $al killed $al killed $eax 68028eb436SSanjay Patel; CHECK-NEXT: retq 69028eb436SSanjay Patel %s = select i1 %b, i8 0, i8 45 70028eb436SSanjay Patel %r = add i8 %offset, %s 71028eb436SSanjay Patel ret i8 %r 72028eb436SSanjay Patel} 73028eb436SSanjay Patel 74*2f448bf5SNikita Popovdefine i32 @select_consts_use_i32(i32 %offset, i64 %x, ptr %p) { 75028eb436SSanjay Patel; CHECK-LABEL: select_consts_use_i32: 76028eb436SSanjay Patel; CHECK: # %bb.0: 77028eb436SSanjay Patel; CHECK-NEXT: xorl %ecx, %ecx 78028eb436SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 79028eb436SSanjay Patel; CHECK-NEXT: movl $43, %eax 80028eb436SSanjay Patel; CHECK-NEXT: cmovgel %ecx, %eax 81028eb436SSanjay Patel; CHECK-NEXT: movl %eax, (%rdx) 82028eb436SSanjay Patel; CHECK-NEXT: addl %edi, %eax 83028eb436SSanjay Patel; CHECK-NEXT: retq 84028eb436SSanjay Patel %b = icmp sgt i64 %x, 41 85028eb436SSanjay Patel %s = select i1 %b, i32 0, i32 43 86*2f448bf5SNikita Popov store i32 %s, ptr %p 87028eb436SSanjay Patel %r = add i32 %offset, %s 88028eb436SSanjay Patel ret i32 %r 89028eb436SSanjay Patel} 90028eb436SSanjay Patel 911ce05ad6SSanjay Patel; Special-case LEA hacks are done before we try to push the add into a CMOV. 921ce05ad6SSanjay Patel 93028eb436SSanjay Pateldefine i32 @select_40_43_i32(i32 %offset, i64 %x) { 94028eb436SSanjay Patel; CHECK-LABEL: select_40_43_i32: 95028eb436SSanjay Patel; CHECK: # %bb.0: 96028eb436SSanjay Patel; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 97028eb436SSanjay Patel; CHECK-NEXT: xorl %eax, %eax 98028eb436SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 99028eb436SSanjay Patel; CHECK-NEXT: setl %al 100028eb436SSanjay Patel; CHECK-NEXT: leal (%rax,%rax,2), %eax 101028eb436SSanjay Patel; CHECK-NEXT: leal 40(%rdi,%rax), %eax 102028eb436SSanjay Patel; CHECK-NEXT: retq 103028eb436SSanjay Patel %b = icmp sgt i64 %x, 41 104028eb436SSanjay Patel %s = select i1 %b, i32 40, i32 43 105028eb436SSanjay Patel %r = add i32 %offset, %s 106028eb436SSanjay Patel ret i32 %r 107028eb436SSanjay Patel} 108028eb436SSanjay Patel 109028eb436SSanjay Pateldefine i32 @select_0_1_i32(i32 %offset, i64 %x) { 110028eb436SSanjay Patel; CHECK-LABEL: select_0_1_i32: 111028eb436SSanjay Patel; CHECK: # %bb.0: 112028eb436SSanjay Patel; CHECK-NEXT: movl %edi, %eax 113028eb436SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 114028eb436SSanjay Patel; CHECK-NEXT: adcl $0, %eax 115028eb436SSanjay Patel; CHECK-NEXT: retq 116028eb436SSanjay Patel %b = icmp ugt i64 %x, 41 117028eb436SSanjay Patel %s = select i1 %b, i32 0, i32 1 118028eb436SSanjay Patel %r = add i32 %offset, %s 119028eb436SSanjay Patel ret i32 %r 120028eb436SSanjay Patel} 121028eb436SSanjay Patel 122028eb436SSanjay Pateldefine i32 @select_1_0_i32(i32 %offset, i64 %x) { 123028eb436SSanjay Patel; CHECK-LABEL: select_1_0_i32: 124028eb436SSanjay Patel; CHECK: # %bb.0: 125028eb436SSanjay Patel; CHECK-NEXT: movl %edi, %eax 126028eb436SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 127028eb436SSanjay Patel; CHECK-NEXT: sbbl $-1, %eax 128028eb436SSanjay Patel; CHECK-NEXT: retq 129028eb436SSanjay Patel %b = icmp ugt i64 %x, 41 130028eb436SSanjay Patel %s = select i1 %b, i32 1, i32 0 131028eb436SSanjay Patel %r = add i32 %offset, %s 132028eb436SSanjay Patel ret i32 %r 133028eb436SSanjay Patel} 134937e7c60SSanjay Patel 135937e7c60SSanjay Pateldefine i64 @select_max32_2_i64(i64 %offset, i64 %x) { 136937e7c60SSanjay Patel; CHECK-LABEL: select_max32_2_i64: 137937e7c60SSanjay Patel; CHECK: # %bb.0: 1381ce05ad6SSanjay Patel; CHECK-NEXT: leaq 2(%rdi), %rax 1396766ece1SSanjay Patel; CHECK-NEXT: leaq 2147483647(%rdi), %rcx 140937e7c60SSanjay Patel; CHECK-NEXT: cmpq $41, %rsi 1416599961cSGuozhi Wei; CHECK-NEXT: cmovneq %rcx, %rax 142937e7c60SSanjay Patel; CHECK-NEXT: retq 143937e7c60SSanjay Patel %b = icmp ne i64 %x, 41 144937e7c60SSanjay Patel %s = select i1 %b, i64 2147483647, i64 2 145937e7c60SSanjay Patel %r = add i64 %offset, %s 146937e7c60SSanjay Patel ret i64 %r 147937e7c60SSanjay Patel} 148937e7c60SSanjay Patel 149937e7c60SSanjay Pateldefine i64 @select_42_min32_i64(i64 %offset, i1 %b) { 150937e7c60SSanjay Patel; CHECK-LABEL: select_42_min32_i64: 151937e7c60SSanjay Patel; CHECK: # %bb.0: 152937e7c60SSanjay Patel; CHECK-NEXT: testb $1, %sil 153937e7c60SSanjay Patel; CHECK-NEXT: movl $42, %ecx 154937e7c60SSanjay Patel; CHECK-NEXT: movl $2147483648, %eax # imm = 0x80000000 155937e7c60SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rax 156937e7c60SSanjay Patel; CHECK-NEXT: addq %rdi, %rax 157937e7c60SSanjay Patel; CHECK-NEXT: retq 158937e7c60SSanjay Patel %s = select i1 %b, i64 42, i64 2147483648 159937e7c60SSanjay Patel %r = add i64 %offset, %s 160937e7c60SSanjay Patel ret i64 %r 161937e7c60SSanjay Patel} 162937e7c60SSanjay Patel 163937e7c60SSanjay Pateldefine i64 @select_big_42_i64(i64 %offset, i64 %x) { 164937e7c60SSanjay Patel; CHECK-LABEL: select_big_42_i64: 165937e7c60SSanjay Patel; CHECK: # %bb.0: 166937e7c60SSanjay Patel; CHECK-NEXT: cmpq $41, %rsi 167937e7c60SSanjay Patel; CHECK-NEXT: movl $2147483649, %ecx # imm = 0x80000001 168937e7c60SSanjay Patel; CHECK-NEXT: movl $42, %eax 169937e7c60SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rax 170937e7c60SSanjay Patel; CHECK-NEXT: addq %rdi, %rax 171937e7c60SSanjay Patel; CHECK-NEXT: retq 172937e7c60SSanjay Patel %b = icmp ne i64 %x, 41 173937e7c60SSanjay Patel %s = select i1 %b, i64 2147483649, i64 42 174937e7c60SSanjay Patel %r = add i64 %s, %offset 175937e7c60SSanjay Patel ret i64 %r 176937e7c60SSanjay Patel} 177937e7c60SSanjay Patel 178937e7c60SSanjay Pateldefine i64 @select_n42_big_i64(i64 %offset, i64 %x) { 179937e7c60SSanjay Patel; CHECK-LABEL: select_n42_big_i64: 180937e7c60SSanjay Patel; CHECK: # %bb.0: 181937e7c60SSanjay Patel; CHECK-NEXT: cmpq $41, %rsi 182937e7c60SSanjay Patel; CHECK-NEXT: movq $-42, %rcx 183937e7c60SSanjay Patel; CHECK-NEXT: movl $2147483649, %eax # imm = 0x80000001 184937e7c60SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rax 185937e7c60SSanjay Patel; CHECK-NEXT: addq %rdi, %rax 186937e7c60SSanjay Patel; CHECK-NEXT: retq 187937e7c60SSanjay Patel %b = icmp ne i64 %x, 41 188937e7c60SSanjay Patel %s = select i1 %b, i64 -42, i64 2147483649 189937e7c60SSanjay Patel %r = add i64 %s, %offset 190937e7c60SSanjay Patel ret i64 %r 191937e7c60SSanjay Patel} 192937e7c60SSanjay Patel 193937e7c60SSanjay Pateldefine i64 @select_big_bigger_i64(i64 %offset, i64 %x) { 194937e7c60SSanjay Patel; CHECK-LABEL: select_big_bigger_i64: 195937e7c60SSanjay Patel; CHECK: # %bb.0: 196937e7c60SSanjay Patel; CHECK-NEXT: cmpq $41, %rsi 197937e7c60SSanjay Patel; CHECK-NEXT: movl $2147483649, %ecx # imm = 0x80000001 198937e7c60SSanjay Patel; CHECK-NEXT: movabsq $42000000000, %rax # imm = 0x9C7652400 199937e7c60SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rax 200937e7c60SSanjay Patel; CHECK-NEXT: addq %rdi, %rax 201937e7c60SSanjay Patel; CHECK-NEXT: retq 202937e7c60SSanjay Patel %b = icmp ne i64 %x, 41 203937e7c60SSanjay Patel %s = select i1 %b, i64 2147483649, i64 42000000000 204937e7c60SSanjay Patel %r = add i64 %s, %offset 205937e7c60SSanjay Patel ret i64 %r 206937e7c60SSanjay Patel} 207937e7c60SSanjay Patel 208937e7c60SSanjay Pateldefine i32 @select_20_43_i32(i32 %offset, i64 %x) { 209937e7c60SSanjay Patel; CHECK-LABEL: select_20_43_i32: 210937e7c60SSanjay Patel; CHECK: # %bb.0: 2111ce05ad6SSanjay Patel; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 2126599961cSGuozhi Wei; CHECK-NEXT: leal 43(%rdi), %ecx 2136766ece1SSanjay Patel; CHECK-NEXT: leal 20(%rdi), %eax 214937e7c60SSanjay Patel; CHECK-NEXT: cmpq $42, %rsi 2156599961cSGuozhi Wei; CHECK-NEXT: cmovll %ecx, %eax 216937e7c60SSanjay Patel; CHECK-NEXT: retq 217937e7c60SSanjay Patel %b = icmp sgt i64 %x, 41 218937e7c60SSanjay Patel %s = select i1 %b, i32 20, i32 43 219937e7c60SSanjay Patel %r = add i32 %offset, %s 220937e7c60SSanjay Patel ret i32 %r 221937e7c60SSanjay Patel} 222937e7c60SSanjay Patel 223937e7c60SSanjay Pateldefine i16 @select_n2_17_i16(i16 %offset, i1 %b) { 224937e7c60SSanjay Patel; CHECK-LABEL: select_n2_17_i16: 225937e7c60SSanjay Patel; CHECK: # %bb.0: 2261ce05ad6SSanjay Patel; CHECK-NEXT: # kill: def $edi killed $edi def $rdi 2276599961cSGuozhi Wei; CHECK-NEXT: leal 17(%rdi), %ecx 2286599961cSGuozhi Wei; CHECK-NEXT: leal 65534(%rdi), %eax 229937e7c60SSanjay Patel; CHECK-NEXT: testb $1, %sil 2306599961cSGuozhi Wei; CHECK-NEXT: cmovel %ecx, %eax 231937e7c60SSanjay Patel; CHECK-NEXT: # kill: def $ax killed $ax killed $eax 232937e7c60SSanjay Patel; CHECK-NEXT: retq 233937e7c60SSanjay Patel %s = select i1 %b, i16 -2, i16 17 234937e7c60SSanjay Patel %r = add i16 %offset, %s 235937e7c60SSanjay Patel ret i16 %r 236937e7c60SSanjay Patel} 237937e7c60SSanjay Patel 238*2f448bf5SNikita Popov%class.btAxis = type { %struct.btBroadphaseProxy.base, [3 x i16], [3 x i16], ptr } 239*2f448bf5SNikita Popov%struct.btBroadphaseProxy.base = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float] }> 240*2f448bf5SNikita Popov%struct.btBroadphaseProxy = type <{ ptr, i16, i16, [4 x i8], ptr, i32, [4 x float], [4 x float], [4 x i8] }> 241937e7c60SSanjay Patel 242*2f448bf5SNikita Popovdefine ptr @bullet(i1 %b, ptr readnone %ptr, i64 %idx) { 243937e7c60SSanjay Patel; CHECK-LABEL: bullet: 244937e7c60SSanjay Patel; CHECK: # %bb.0: 2451ce05ad6SSanjay Patel; CHECK-NEXT: leaq (%rdx,%rdx,4), %rax 2461ce05ad6SSanjay Patel; CHECK-NEXT: shlq $4, %rax 2471ce05ad6SSanjay Patel; CHECK-NEXT: leaq 60(%rsi,%rax), %rcx 2481ce05ad6SSanjay Patel; CHECK-NEXT: leaq 66(%rsi,%rax), %rax 249937e7c60SSanjay Patel; CHECK-NEXT: testb $1, %dil 2501ce05ad6SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rax 251937e7c60SSanjay Patel; CHECK-NEXT: retq 252*2f448bf5SNikita Popov %gep2 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 2, i64 0 253*2f448bf5SNikita Popov %gep1 = getelementptr inbounds %class.btAxis, ptr %ptr, i64 %idx, i32 1, i64 0 254*2f448bf5SNikita Popov %sel = select i1 %b, ptr %gep1, ptr %gep2 255*2f448bf5SNikita Popov ret ptr %sel 256937e7c60SSanjay Patel} 2570b8d30b1SSanjay Patel 258*2f448bf5SNikita Popovdefine ptr @bullet_alt1(i1 %b, ptr readnone %ptr, i64 %idx) { 2590b8d30b1SSanjay Patel; CHECK-LABEL: bullet_alt1: 2600b8d30b1SSanjay Patel; CHECK: # %bb.0: 2610b8d30b1SSanjay Patel; CHECK-NEXT: leaq 60(%rsi), %rax 2620b8d30b1SSanjay Patel; CHECK-NEXT: leaq 66(%rsi), %rcx 2630b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 2640b8d30b1SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rcx 2650b8d30b1SSanjay Patel; CHECK-NEXT: leaq (%rdx,%rdx,4), %rax 2660b8d30b1SSanjay Patel; CHECK-NEXT: shlq $4, %rax 2670b8d30b1SSanjay Patel; CHECK-NEXT: addq %rcx, %rax 2680b8d30b1SSanjay Patel; CHECK-NEXT: retq 2690b8d30b1SSanjay Patel %idx40 = mul i64 %idx, 40 270*2f448bf5SNikita Popov %gep2 = getelementptr inbounds i16, ptr %ptr, i64 33 271*2f448bf5SNikita Popov %gep1 = getelementptr inbounds i16, ptr %ptr, i64 30 272*2f448bf5SNikita Popov %sel = select i1 %b, ptr %gep1, ptr %gep2 273*2f448bf5SNikita Popov %gep3 = getelementptr inbounds i16, ptr %sel, i64 %idx40 274*2f448bf5SNikita Popov ret ptr %gep3 2750b8d30b1SSanjay Patel} 2760b8d30b1SSanjay Patel 277*2f448bf5SNikita Popovdefine void @bullet_load_store(i32 %x, i64 %y, ptr %p) { 2780b8d30b1SSanjay Patel; CHECK-LABEL: bullet_load_store: 2790b8d30b1SSanjay Patel; CHECK: # %bb.0: 2800b8d30b1SSanjay Patel; CHECK-NEXT: leaq (%rsi,%rsi,4), %rax 2810b8d30b1SSanjay Patel; CHECK-NEXT: shlq $4, %rax 2824c41caa2SSanjay Patel; CHECK-NEXT: leaq 66(%rdx), %rcx 2834c41caa2SSanjay Patel; CHECK-NEXT: addq $60, %rdx 2840b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 2854c41caa2SSanjay Patel; CHECK-NEXT: cmovneq %rcx, %rdx 2864c41caa2SSanjay Patel; CHECK-NEXT: decw (%rdx,%rax) 2870b8d30b1SSanjay Patel; CHECK-NEXT: retq 2880b8d30b1SSanjay Patel %and = and i32 %x, 1 2890b8d30b1SSanjay Patel %b = icmp eq i32 %and, 0 290*2f448bf5SNikita Popov %gep2 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 2, i64 0 291*2f448bf5SNikita Popov %gep1 = getelementptr inbounds %class.btAxis, ptr %p, i64 %y, i32 1, i64 0 292*2f448bf5SNikita Popov %sel = select i1 %b, ptr %gep1, ptr %gep2 293*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 2940b8d30b1SSanjay Patel %dec = add i16 %ld, -1 295*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 2960b8d30b1SSanjay Patel ret void 2970b8d30b1SSanjay Patel} 2980b8d30b1SSanjay Patel 299*2f448bf5SNikita Popovdefine void @complex_lea_alt1(i1 %b, ptr readnone %ptr, i64 %idx) { 3000b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt1: 3010b8d30b1SSanjay Patel; CHECK: # %bb.0: 3024c41caa2SSanjay Patel; CHECK-NEXT: leaq 60(%rdx), %rax 3034c41caa2SSanjay Patel; CHECK-NEXT: addq $66, %rdx 3040b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 3054c41caa2SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rdx 3064c41caa2SSanjay Patel; CHECK-NEXT: decw (%rdx,%rsi) 3070b8d30b1SSanjay Patel; CHECK-NEXT: retq 308*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 3090b8d30b1SSanjay Patel %sum = add i64 %idx, %i 310*2f448bf5SNikita Popov %base = inttoptr i64 %sum to ptr 311*2f448bf5SNikita Popov %gep2 = getelementptr inbounds i16, ptr %base, i64 33 312*2f448bf5SNikita Popov %gep1 = getelementptr inbounds i16, ptr %base, i64 30 313*2f448bf5SNikita Popov %sel = select i1 %b, ptr %gep1, ptr %gep2 314*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 3150b8d30b1SSanjay Patel %dec = add i16 %ld, -1 316*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 3170b8d30b1SSanjay Patel ret void 3180b8d30b1SSanjay Patel} 3190b8d30b1SSanjay Patel 320*2f448bf5SNikita Popovdefine void @complex_lea_alt2(i1 %b, ptr readnone %ptr, i64 %idx) { 3210b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt2: 3220b8d30b1SSanjay Patel; CHECK: # %bb.0: 3234c41caa2SSanjay Patel; CHECK-NEXT: leaq 60(%rsi), %rax 3244c41caa2SSanjay Patel; CHECK-NEXT: addq $66, %rsi 3250b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 3264c41caa2SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rsi 3274c41caa2SSanjay Patel; CHECK-NEXT: decw (%rsi,%rdx) 3280b8d30b1SSanjay Patel; CHECK-NEXT: retq 329*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 3300b8d30b1SSanjay Patel %sum = add i64 %i, %idx 331*2f448bf5SNikita Popov %base = inttoptr i64 %sum to ptr 332*2f448bf5SNikita Popov %gep2 = getelementptr inbounds i16, ptr %base, i64 33 333*2f448bf5SNikita Popov %gep1 = getelementptr inbounds i16, ptr %base, i64 30 334*2f448bf5SNikita Popov %sel = select i1 %b, ptr %gep1, ptr %gep2 335*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 3360b8d30b1SSanjay Patel %dec = add i16 %ld, -1 337*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 3380b8d30b1SSanjay Patel ret void 3390b8d30b1SSanjay Patel} 3400b8d30b1SSanjay Patel 341*2f448bf5SNikita Popovdefine void @complex_lea_alt3(i1 %b, ptr readnone %ptr, i64 %idx) { 3420b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt3: 3430b8d30b1SSanjay Patel; CHECK: # %bb.0: 3440b8d30b1SSanjay Patel; CHECK-NEXT: leaq 60(%rsi), %rax 3450b8d30b1SSanjay Patel; CHECK-NEXT: addq $66, %rsi 3460b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 3470b8d30b1SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rsi 3480b8d30b1SSanjay Patel; CHECK-NEXT: decw (%rsi,%rdx) 3490b8d30b1SSanjay Patel; CHECK-NEXT: retq 350*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 3510b8d30b1SSanjay Patel %i66 = add i64 %i, 66 3520b8d30b1SSanjay Patel %i60 = add i64 %i, 60 3530b8d30b1SSanjay Patel %o66 = add i64 %i66, %idx 3540b8d30b1SSanjay Patel %o60 = add i64 %i60, %idx 355*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 356*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 357*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 358*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 3590b8d30b1SSanjay Patel %dec = add i16 %ld, -1 360*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 3610b8d30b1SSanjay Patel ret void 3620b8d30b1SSanjay Patel} 3630b8d30b1SSanjay Patel 364*2f448bf5SNikita Popovdefine void @complex_lea_alt4(i1 %b, ptr readnone %ptr, i64 %idx) { 3650b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt4: 3660b8d30b1SSanjay Patel; CHECK: # %bb.0: 3670b8d30b1SSanjay Patel; CHECK-NEXT: leaq 60(%rsi), %rax 3680b8d30b1SSanjay Patel; CHECK-NEXT: addq $66, %rsi 3690b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 3700b8d30b1SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rsi 3710b8d30b1SSanjay Patel; CHECK-NEXT: decw (%rdx,%rsi) 3720b8d30b1SSanjay Patel; CHECK-NEXT: retq 373*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 3740b8d30b1SSanjay Patel %i66 = add i64 %i, 66 3750b8d30b1SSanjay Patel %i60 = add i64 %i, 60 3760b8d30b1SSanjay Patel %o66 = add i64 %idx, %i66 3770b8d30b1SSanjay Patel %o60 = add i64 %idx, %i60 378*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 379*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 380*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 381*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 3820b8d30b1SSanjay Patel %dec = add i16 %ld, -1 383*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 3840b8d30b1SSanjay Patel ret void 3850b8d30b1SSanjay Patel} 3860b8d30b1SSanjay Patel 387*2f448bf5SNikita Popovdefine void @complex_lea_alt5(i1 %b, ptr readnone %ptr, i64 %idx) { 3880b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt5: 3890b8d30b1SSanjay Patel; CHECK: # %bb.0: 3900b8d30b1SSanjay Patel; CHECK-NEXT: leaq 60(%rdx), %rax 3910b8d30b1SSanjay Patel; CHECK-NEXT: addq $66, %rdx 3920b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 3930b8d30b1SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rdx 3940b8d30b1SSanjay Patel; CHECK-NEXT: decw (%rdx,%rsi) 3950b8d30b1SSanjay Patel; CHECK-NEXT: retq 396*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 3970b8d30b1SSanjay Patel %i66 = add i64 %idx, 66 3980b8d30b1SSanjay Patel %i60 = add i64 %idx, 60 3990b8d30b1SSanjay Patel %o66 = add i64 %i66, %i 4000b8d30b1SSanjay Patel %o60 = add i64 %i60, %i 401*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 402*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 403*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 404*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 4050b8d30b1SSanjay Patel %dec = add i16 %ld, -1 406*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 4070b8d30b1SSanjay Patel ret void 4080b8d30b1SSanjay Patel} 4090b8d30b1SSanjay Patel 410*2f448bf5SNikita Popovdefine void @complex_lea_alt6(i1 %b, ptr readnone %ptr, i64 %idx) { 4110b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt6: 4120b8d30b1SSanjay Patel; CHECK: # %bb.0: 4130b8d30b1SSanjay Patel; CHECK-NEXT: leaq 60(%rdx), %rax 4140b8d30b1SSanjay Patel; CHECK-NEXT: addq $66, %rdx 4150b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 4160b8d30b1SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rdx 4170b8d30b1SSanjay Patel; CHECK-NEXT: decw (%rsi,%rdx) 4180b8d30b1SSanjay Patel; CHECK-NEXT: retq 419*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 4200b8d30b1SSanjay Patel %i66 = add i64 %idx, 66 4210b8d30b1SSanjay Patel %i60 = add i64 %idx, 60 4220b8d30b1SSanjay Patel %o66 = add i64 %i, %i66 4230b8d30b1SSanjay Patel %o60 = add i64 %i, %i60 424*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 425*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 426*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 427*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 4280b8d30b1SSanjay Patel %dec = add i16 %ld, -1 429*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 4300b8d30b1SSanjay Patel ret void 4310b8d30b1SSanjay Patel} 4320b8d30b1SSanjay Patel 433*2f448bf5SNikita Popovdefine void @complex_lea_alt7(i1 %b, ptr readnone %ptr, i64 %idx) { 4340b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt7: 4350b8d30b1SSanjay Patel; CHECK: # %bb.0: 4364c41caa2SSanjay Patel; CHECK-NEXT: leaq 60(%rdx), %rax 4374c41caa2SSanjay Patel; CHECK-NEXT: addq $66, %rdx 4380b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 4394c41caa2SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rdx 4404c41caa2SSanjay Patel; CHECK-NEXT: decw (%rdx,%rsi) 4410b8d30b1SSanjay Patel; CHECK-NEXT: retq 442*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 4430b8d30b1SSanjay Patel %o = add i64 %idx, %i 4440b8d30b1SSanjay Patel %o66 = add i64 %o, 66 4450b8d30b1SSanjay Patel %o60 = add i64 %o, 60 446*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 447*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 448*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 449*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 4500b8d30b1SSanjay Patel %dec = add i16 %ld, -1 451*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 4520b8d30b1SSanjay Patel ret void 4530b8d30b1SSanjay Patel} 4540b8d30b1SSanjay Patel 455*2f448bf5SNikita Popovdefine void @complex_lea_alt8(i1 %b, ptr readnone %ptr, i64 %idx) { 4560b8d30b1SSanjay Patel; CHECK-LABEL: complex_lea_alt8: 4570b8d30b1SSanjay Patel; CHECK: # %bb.0: 4584c41caa2SSanjay Patel; CHECK-NEXT: leaq 60(%rsi), %rax 4594c41caa2SSanjay Patel; CHECK-NEXT: addq $66, %rsi 4600b8d30b1SSanjay Patel; CHECK-NEXT: testb $1, %dil 4614c41caa2SSanjay Patel; CHECK-NEXT: cmovneq %rax, %rsi 4624c41caa2SSanjay Patel; CHECK-NEXT: decw (%rsi,%rdx) 4630b8d30b1SSanjay Patel; CHECK-NEXT: retq 464*2f448bf5SNikita Popov %i = ptrtoint ptr %ptr to i64 4650b8d30b1SSanjay Patel %o = add i64 %i, %idx 4660b8d30b1SSanjay Patel %o66 = add i64 %o, 66 4670b8d30b1SSanjay Patel %o60 = add i64 %o, 60 468*2f448bf5SNikita Popov %p66 = inttoptr i64 %o66 to ptr 469*2f448bf5SNikita Popov %p60 = inttoptr i64 %o60 to ptr 470*2f448bf5SNikita Popov %sel = select i1 %b, ptr %p60, ptr %p66 471*2f448bf5SNikita Popov %ld = load i16, ptr %sel, align 4 4720b8d30b1SSanjay Patel %dec = add i16 %ld, -1 473*2f448bf5SNikita Popov store i16 %dec, ptr %sel, align 4 4740b8d30b1SSanjay Patel ret void 4750b8d30b1SSanjay Patel} 4766766ece1SSanjay Patel 477*2f448bf5SNikita Popovdefine i32 @loadfold_select_const_arms(ptr %x, i1 %y) { 4786766ece1SSanjay Patel; CHECK-LABEL: loadfold_select_const_arms: 4796766ece1SSanjay Patel; CHECK: # %bb.0: 4806766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 481ad7214f2SSanjay Patel; CHECK-NEXT: movl $10, %ecx 482ad7214f2SSanjay Patel; CHECK-NEXT: movl $-10, %eax 483ad7214f2SSanjay Patel; CHECK-NEXT: cmovnel %ecx, %eax 484ad7214f2SSanjay Patel; CHECK-NEXT: addl (%rdi), %eax 4856766ece1SSanjay Patel; CHECK-NEXT: retq 4866766ece1SSanjay Patel %cond = select i1 %y, i32 10, i32 -10 487*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 4886766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 4896766ece1SSanjay Patel ret i32 %add 4906766ece1SSanjay Patel} 4916766ece1SSanjay Patel 492*2f448bf5SNikita Popovdefine void @rmw_add(ptr %x, i1 %y, i32 %z, i32 %w) { 4936766ece1SSanjay Patel; CHECK-LABEL: rmw_add: 4946766ece1SSanjay Patel; CHECK: # %bb.0: 4956766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 4966766ece1SSanjay Patel; CHECK-NEXT: cmovel %ecx, %edx 4976766ece1SSanjay Patel; CHECK-NEXT: addl %edx, (%rdi) 4986766ece1SSanjay Patel; CHECK-NEXT: retq 4996766ece1SSanjay Patel %cond = select i1 %y, i32 %z, i32 %w 500*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 5016766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 502*2f448bf5SNikita Popov store i32 %add, ptr %x, align 4 5036766ece1SSanjay Patel ret void 5046766ece1SSanjay Patel} 5056766ece1SSanjay Patel 506*2f448bf5SNikita Popovdefine void @rmw_add_select_const_arm(ptr %x, i1 %y, i32 %z) { 5076766ece1SSanjay Patel; CHECK-LABEL: rmw_add_select_const_arm: 5086766ece1SSanjay Patel; CHECK: # %bb.0: 5096766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 5106766ece1SSanjay Patel; CHECK-NEXT: movl $-10, %eax 5116766ece1SSanjay Patel; CHECK-NEXT: cmovnel %edx, %eax 5126766ece1SSanjay Patel; CHECK-NEXT: addl %eax, (%rdi) 5136766ece1SSanjay Patel; CHECK-NEXT: retq 5146766ece1SSanjay Patel %cond = select i1 %y, i32 %z, i32 -10 515*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 5166766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 517*2f448bf5SNikita Popov store i32 %add, ptr %x, align 4 5186766ece1SSanjay Patel ret void 5196766ece1SSanjay Patel} 5206766ece1SSanjay Patel 521*2f448bf5SNikita Popovdefine void @rmw_select_const_arms(ptr %x, i1 %y) { 5226766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms: 5236766ece1SSanjay Patel; CHECK: # %bb.0: 5246766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 525ad7214f2SSanjay Patel; CHECK-NEXT: movl $10, %eax 526ad7214f2SSanjay Patel; CHECK-NEXT: movl $-10, %ecx 527ad7214f2SSanjay Patel; CHECK-NEXT: cmovnel %eax, %ecx 528ad7214f2SSanjay Patel; CHECK-NEXT: addl %ecx, (%rdi) 5296766ece1SSanjay Patel; CHECK-NEXT: retq 5306766ece1SSanjay Patel %cond = select i1 %y, i32 10, i32 -10 531*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 5326766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 533*2f448bf5SNikita Popov store i32 %add, ptr %x, align 4 5346766ece1SSanjay Patel ret void 5356766ece1SSanjay Patel} 5366766ece1SSanjay Patel 537*2f448bf5SNikita Popovdefine i32 @rmw_select_const_arms_extra_load_use(ptr %x, i1 %y) { 5386766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms_extra_load_use: 5396766ece1SSanjay Patel; CHECK: # %bb.0: 5406766ece1SSanjay Patel; CHECK-NEXT: movl (%rdi), %eax 5416766ece1SSanjay Patel; CHECK-NEXT: leal -10(%rax), %ecx 5426766ece1SSanjay Patel; CHECK-NEXT: leal 10(%rax), %edx 5436766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 5446766ece1SSanjay Patel; CHECK-NEXT: cmovel %ecx, %edx 5456766ece1SSanjay Patel; CHECK-NEXT: movl %edx, (%rdi) 5466766ece1SSanjay Patel; CHECK-NEXT: # kill: def $eax killed $eax killed $rax 5476766ece1SSanjay Patel; CHECK-NEXT: retq 5486766ece1SSanjay Patel %cond = select i1 %y, i32 10, i32 -10 549*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 5506766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 551*2f448bf5SNikita Popov store i32 %add, ptr %x, align 4 5526766ece1SSanjay Patel ret i32 %t0 5536766ece1SSanjay Patel} 5546766ece1SSanjay Patel 555*2f448bf5SNikita Popovdefine i32 @rmw_select_const_arms_extra_add_use(ptr %x, i1 %y) { 5566766ece1SSanjay Patel; CHECK-LABEL: rmw_select_const_arms_extra_add_use: 5576766ece1SSanjay Patel; CHECK: # %bb.0: 5586766ece1SSanjay Patel; CHECK-NEXT: testb $1, %sil 559ad7214f2SSanjay Patel; CHECK-NEXT: movl $10, %ecx 560ad7214f2SSanjay Patel; CHECK-NEXT: movl $-10, %eax 561ad7214f2SSanjay Patel; CHECK-NEXT: cmovnel %ecx, %eax 562ad7214f2SSanjay Patel; CHECK-NEXT: addl (%rdi), %eax 5636766ece1SSanjay Patel; CHECK-NEXT: movl %eax, (%rdi) 5646766ece1SSanjay Patel; CHECK-NEXT: retq 5656766ece1SSanjay Patel %cond = select i1 %y, i32 10, i32 -10 566*2f448bf5SNikita Popov %t0 = load i32, ptr %x, align 4 5676766ece1SSanjay Patel %add = add nsw i32 %t0, %cond 568*2f448bf5SNikita Popov store i32 %add, ptr %x, align 4 5696766ece1SSanjay Patel ret i32 %add 5706766ece1SSanjay Patel} 571