144 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X644 5define i32 @mask_add_sext_i32_i64(ptr %base, i32 %i) {6; X86-LABEL: mask_add_sext_i32_i64:7; X86: # %bb.0:8; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax9; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx10; X86-NEXT: movl 12(%ecx,%eax,4), %eax11; X86-NEXT: retl12;13; X64-LABEL: mask_add_sext_i32_i64:14; X64: # %bb.0:15; X64-NEXT: sarl $24, %esi16; X64-NEXT: movslq %esi, %rax17; X64-NEXT: movl 12(%rdi,%rax,4), %eax18; X64-NEXT: retq19 %mask = ashr i32 %i, 2420 %offset = add i32 %mask, 321 %sext = sext i32 %offset to i6422 %gep = getelementptr i32, ptr %base, i64 %sext23 %ret = load i32, ptr %gep24 ret i32 %ret25}26 27define i32 @mask_add_zext_i32_i64(ptr %base, i32 %i) {28; X86-LABEL: mask_add_zext_i32_i64:29; X86: # %bb.0:30; X86-NEXT: movl {{[0-9]+}}(%esp), %eax31; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx32; X86-NEXT: andl $15, %ecx33; X86-NEXT: movl 12(%eax,%ecx,4), %eax34; X86-NEXT: retl35;36; X64-LABEL: mask_add_zext_i32_i64:37; X64: # %bb.0:38; X64-NEXT: # kill: def $esi killed $esi def $rsi39; X64-NEXT: andl $15, %esi40; X64-NEXT: movl 12(%rdi,%rsi,4), %eax41; X64-NEXT: retq42 %mask = and i32 %i, 1543 %offset = add i32 %mask, 344 %zext = zext i32 %offset to i6445 %gep = getelementptr i32, ptr %base, i64 %zext46 %ret = load i32, ptr %gep47 ret i32 %ret48}49 50define i32 @mask_offset_scale_zext_i32_i64(ptr %base, i32 %i) {51; X86-LABEL: mask_offset_scale_zext_i32_i64:52; X86: # %bb.0:53; X86-NEXT: movl {{[0-9]+}}(%esp), %eax54; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx55; X86-NEXT: shll $11, %ecx56; X86-NEXT: movl 48(%eax,%ecx), %eax57; X86-NEXT: retl58;59; X64-LABEL: mask_offset_scale_zext_i32_i64:60; X64: # %bb.0:61; X64-NEXT: # kill: def $esi killed $esi def $rsi62; X64-NEXT: andl $65280, %esi # imm = 0xFF0063; X64-NEXT: movl 48(%rdi,%rsi,8), %eax64; X64-NEXT: retq65 %mask = and i32 %i, 6528066 %offset = or i32 %mask, 667 %scale = shl i32 %offset, 168 %idxprom = zext i32 %scale to i6469 %arrayidx = getelementptr inbounds i32, ptr %base, i64 %idxprom70 %load = load i32, ptr %arrayidx, align 471 ret i32 %load72}73 74; PR97533 - multiple uses of shl node (add + gep) in the same dependency chain.75define i64 @add_shl_zext(ptr %ptr, i8 %arg) nounwind {76; X86-LABEL: add_shl_zext:77; X86: # %bb.0:78; X86-NEXT: pushl %esi79; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx80; X86-NEXT: movl {{[0-9]+}}(%esp), %esi81; X86-NEXT: movl 4(%esi,%ecx,4), %edx82; X86-NEXT: leal (,%ecx,8), %eax83; X86-NEXT: addl (%esi,%ecx,4), %eax84; X86-NEXT: adcl $0, %edx85; X86-NEXT: popl %esi86; X86-NEXT: retl87;88; X64-LABEL: add_shl_zext:89; X64: # %bb.0:90; X64-NEXT: movzbl %sil, %eax91; X64-NEXT: shll $3, %eax92; X64-NEXT: addq (%rdi,%rax), %rax93; X64-NEXT: retq94 %idx = zext i8 %arg to i6495 %gep = getelementptr ptr, ptr %ptr, i64 %idx96 %val = load i64, ptr %gep, align 897 %shl = shl i64 %idx, 398 %sum = add i64 %val, %shl99 ret i64 %sum100}101 102define i32 @PR55714_i32(i32 %n, i32 %q) {103; X86-LABEL: PR55714_i32:104; X86: # %bb.0:105; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx106; X86-NEXT: leal (,%ecx,8), %eax107; X86-NEXT: addl {{[0-9]+}}(%esp), %eax108; X86-NEXT: subl %ecx, %eax109; X86-NEXT: retl110;111; X64-LABEL: PR55714_i32:112; X64: # %bb.0:113; X64-NEXT: # kill: def $esi killed $esi def $rsi114; X64-NEXT: # kill: def $edi killed $edi def $rdi115; X64-NEXT: leal (%rdi,%rsi,8), %eax116; X64-NEXT: subl %esi, %eax117; X64-NEXT: retq118 %mul = mul i32 %q, 7119 %add = add i32 %mul, %n120 ret i32 %add121}122 123define i64 @PR55714_i64(i64 %n, i64 %q) {124; X86-LABEL: PR55714_i64:125; X86: # %bb.0:126; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx127; X86-NEXT: movl $7, %eax128; X86-NEXT: mull {{[0-9]+}}(%esp)129; X86-NEXT: leal (%edx,%ecx,8), %edx130; X86-NEXT: subl %ecx, %edx131; X86-NEXT: addl {{[0-9]+}}(%esp), %eax132; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx133; X86-NEXT: retl134;135; X64-LABEL: PR55714_i64:136; X64: # %bb.0:137; X64-NEXT: leaq (%rdi,%rsi,8), %rax138; X64-NEXT: subq %rsi, %rax139; X64-NEXT: retq140 %mul = mul i64 %q, 7141 %add = add i64 %mul, %n142 ret i64 %add143}144