[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / addr-mode-matcher-2.ll
blobc29f7e8115847c22cb7432b7d1173217363ab7e6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
5 ; Test coverage for matchAddressRecursively's MUL handling
7 ; Based off:
8 ; struct A {
9 ;   int m_ints[5];
10 ;   int m_bar();
11 ; };
12 ; struct {
13 ;   A* m_data;
14 ; } c;
15 ; void foo(bool b, int i) {
16 ;   if (b)
17 ;     return;
18 ;   int j = c.m_data[i + 1].m_bar();
19 ;   foo(false, j);
20 ; }
22 %struct.A = type { [5 x i32] }
24 define void @foo(i1 zeroext, i32) nounwind {
25 ; X86-LABEL: foo:
26 ; X86:       # %bb.0:
27 ; X86-NEXT:    cmpb $0, {{[0-9]+}}(%esp)
28 ; X86-NEXT:    je .LBB0_1
29 ; X86-NEXT:  # %bb.3:
30 ; X86-NEXT:    retl
31 ; X86-NEXT:  .LBB0_1: # %.preheader
32 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
33 ; X86-NEXT:    .p2align 4, 0x90
34 ; X86-NEXT:  .LBB0_2: # =>This Inner Loop Header: Depth=1
35 ; X86-NEXT:    leal (%eax,%eax,4), %eax
36 ; X86-NEXT:    leal 20(,%eax,4), %eax
37 ; X86-NEXT:    pushl %eax
38 ; X86-NEXT:    calll bar
39 ; X86-NEXT:    addl $4, %esp
40 ; X86-NEXT:    jmp .LBB0_2
42 ; X64-LABEL: foo:
43 ; X64:       # %bb.0:
44 ; X64-NEXT:    pushq %rax
45 ; X64-NEXT:    testl %edi, %edi
46 ; X64-NEXT:    je .LBB0_1
47 ; X64-NEXT:  # %bb.3:
48 ; X64-NEXT:    popq %rax
49 ; X64-NEXT:    retq
50 ; X64-NEXT:  .LBB0_1: # %.preheader
51 ; X64-NEXT:    movl %esi, %eax
52 ; X64-NEXT:    .p2align 4, 0x90
53 ; X64-NEXT:  .LBB0_2: # =>This Inner Loop Header: Depth=1
54 ; X64-NEXT:    incl %eax
55 ; X64-NEXT:    cltq
56 ; X64-NEXT:    shlq $2, %rax
57 ; X64-NEXT:    leaq (%rax,%rax,4), %rdi
58 ; X64-NEXT:    callq bar
59 ; X64-NEXT:    jmp .LBB0_2
60   br i1 %0, label %9, label %3
62   %4 = phi i32 [ %8, %3 ], [ %1, %2 ]
63   %5 = add nsw i32 %4, 1
64   %6 = sext i32 %5 to i64
65   %7 = getelementptr inbounds %struct.A, %struct.A* null, i64 %6
66   %8 = tail call i32 @bar(%struct.A* %7)
67   br label %3
69   ret void
72 declare i32 @bar(%struct.A*)