blob: fb7fe12d296c85fdbf217d562e8e659ee4e00a6b [file] [log] [blame]
Simon Pilgrim804cbd62017-07-27 10:36:09 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s -check-prefix=X64
3; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s -check-prefix=X86
4
5define i32 @foo(i32 %a, i32 %b) local_unnamed_addr #0 {
6; X64-LABEL: foo:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00007; X64: # %bb.0: # %entry
Puyan Lotfi43e94b12018-01-31 22:04:26 +00008; X64-NEXT: # kill: def $esi killed $esi def $rsi
9; X64-NEXT: # kill: def $edi killed $edi def $rdi
Simon Pilgrim804cbd62017-07-27 10:36:09 +000010; X64-NEXT: leal 4(%rdi,%rsi,2), %ecx
Matt Morehouse9e658c92017-12-01 22:20:26 +000011; X64-NEXT: leal 4(%rdi,%rsi,4), %eax
Simon Pilgrim804cbd62017-07-27 10:36:09 +000012; X64-NEXT: imull %ecx, %eax
13; X64-NEXT: retq
14;
15; X86-LABEL: foo:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000016; X86: # %bb.0: # %entry
Simon Pilgrim804cbd62017-07-27 10:36:09 +000017; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
18; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
Matt Morehouse9e658c92017-12-01 22:20:26 +000019; X86-NEXT: leal 4(%ecx,%eax,2), %edx
20; X86-NEXT: leal 4(%ecx,%eax,4), %eax
21; X86-NEXT: imull %edx, %eax
Simon Pilgrim804cbd62017-07-27 10:36:09 +000022; X86-NEXT: retl
23entry:
24 %mul = shl i32 %b, 1
25 %add = add i32 %a, 4
26 %add1 = add i32 %add, %mul
27 %mul2 = shl i32 %b, 2
28 %add4 = add i32 %add, %mul2
29 %mul5 = mul nsw i32 %add1, %add4
30 ret i32 %mul5
31}
32
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000033define i32 @foo1(i32 %a, i32 %b) local_unnamed_addr #0 {
34; X64-LABEL: foo1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000035; X64: # %bb.0: # %entry
Puyan Lotfi43e94b12018-01-31 22:04:26 +000036; X64-NEXT: # kill: def $esi killed $esi def $rsi
37; X64-NEXT: # kill: def $edi killed $edi def $rdi
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000038; X64-NEXT: leal 4(%rdi,%rsi,4), %ecx
Matt Morehouse9e658c92017-12-01 22:20:26 +000039; X64-NEXT: leal 4(%rdi,%rsi,8), %eax
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000040; X64-NEXT: imull %ecx, %eax
41; X64-NEXT: retq
42;
43; X86-LABEL: foo1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000044; X86: # %bb.0: # %entry
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000045; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
46; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
Matt Morehouse9e658c92017-12-01 22:20:26 +000047; X86-NEXT: leal 4(%ecx,%eax,4), %edx
48; X86-NEXT: leal 4(%ecx,%eax,8), %eax
49; X86-NEXT: imull %edx, %eax
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000050; X86-NEXT: retl
51entry:
52 %mul = shl i32 %b, 2
53 %add = add i32 %a, 4
54 %add1 = add i32 %add, %mul
55 %mul2 = shl i32 %b, 3
56 %add4 = add i32 %add, %mul2
57 %mul5 = mul nsw i32 %add1, %add4
58 ret i32 %mul5
59}
60
61define i32 @foo1_mult_basic_blocks(i32 %a, i32 %b) local_unnamed_addr #0 {
62; X64-LABEL: foo1_mult_basic_blocks:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000063; X64: # %bb.0: # %entry
Puyan Lotfi43e94b12018-01-31 22:04:26 +000064; X64-NEXT: # kill: def $esi killed $esi def $rsi
65; X64-NEXT: # kill: def $edi killed $edi def $rdi
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000066; X64-NEXT: leal 4(%rdi,%rsi,4), %ecx
67; X64-NEXT: xorl %eax, %eax
68; X64-NEXT: cmpl $10, %ecx
69; X64-NEXT: je .LBB2_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000070; X64-NEXT: # %bb.1: # %mid
Matt Morehouse9e658c92017-12-01 22:20:26 +000071; X64-NEXT: leal 4(%rdi,%rsi,8), %eax
72; X64-NEXT: imull %eax, %ecx
73; X64-NEXT: movl %ecx, %eax
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000074; X64-NEXT: .LBB2_2: # %exit
75; X64-NEXT: retq
76;
77; X86-LABEL: foo1_mult_basic_blocks:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000078; X86: # %bb.0: # %entry
Matt Morehouse9e658c92017-12-01 22:20:26 +000079; X86-NEXT: pushl %esi
80; X86-NEXT: .cfi_def_cfa_offset 8
81; X86-NEXT: .cfi_offset %esi, -8
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000082; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
Matt Morehouse9e658c92017-12-01 22:20:26 +000083; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
84; X86-NEXT: leal 4(%esi,%edx,4), %ecx
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000085; X86-NEXT: xorl %eax, %eax
86; X86-NEXT: cmpl $10, %ecx
87; X86-NEXT: je .LBB2_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000088; X86-NEXT: # %bb.1: # %mid
Matt Morehouse9e658c92017-12-01 22:20:26 +000089; X86-NEXT: leal 4(%esi,%edx,8), %eax
90; X86-NEXT: imull %eax, %ecx
91; X86-NEXT: movl %ecx, %eax
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000092; X86-NEXT: .LBB2_2: # %exit
Matt Morehouse9e658c92017-12-01 22:20:26 +000093; X86-NEXT: popl %esi
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +000094; X86-NEXT: retl
95entry:
96 %mul = shl i32 %b, 2
97 %add = add i32 %a, 4
98 %add1 = add i32 %add, %mul
99 %cmp = icmp ne i32 %add1 , 10
100 br i1 %cmp , label %mid , label %exit
101mid:
102 %addn = add i32 %a , 4
103 %mul2 = shl i32 %b, 3
104 %add4 = add i32 %addn, %mul2
105 %mul5 = mul nsw i32 %add1, %add4
106 br label %exit
107
108exit:
109 %retmul = phi i32 [%mul5 , %mid] , [0 , %entry]
110 ret i32 %retmul
111}
112
113define i32 @foo1_mult_basic_blocks_illegal_scale(i32 %a, i32 %b) local_unnamed_addr #0 {
114; X64-LABEL: foo1_mult_basic_blocks_illegal_scale:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000115; X64: # %bb.0: # %entry
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000116; X64-NEXT: # kill: def $esi killed $esi def $rsi
117; X64-NEXT: # kill: def $edi killed $edi def $rdi
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000118; X64-NEXT: leal 4(%rdi,%rsi,2), %ecx
119; X64-NEXT: xorl %eax, %eax
120; X64-NEXT: cmpl $10, %ecx
121; X64-NEXT: je .LBB3_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000122; X64-NEXT: # %bb.1: # %mid
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000123; X64-NEXT: leal 4(%rdi,%rsi,8), %eax
124; X64-NEXT: imull %eax, %ecx
125; X64-NEXT: movl %ecx, %eax
126; X64-NEXT: .LBB3_2: # %exit
127; X64-NEXT: retq
128;
129; X86-LABEL: foo1_mult_basic_blocks_illegal_scale:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000130; X86: # %bb.0: # %entry
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000131; X86-NEXT: pushl %esi
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000132; X86-NEXT: .cfi_def_cfa_offset 8
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000133; X86-NEXT: .cfi_offset %esi, -8
134; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
135; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
136; X86-NEXT: leal 4(%esi,%edx,2), %ecx
137; X86-NEXT: xorl %eax, %eax
138; X86-NEXT: cmpl $10, %ecx
139; X86-NEXT: je .LBB3_2
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000140; X86-NEXT: # %bb.1: # %mid
Simon Pilgrim11ea6fd2017-07-31 14:23:28 +0000141; X86-NEXT: leal 4(%esi,%edx,8), %eax
142; X86-NEXT: imull %eax, %ecx
143; X86-NEXT: movl %ecx, %eax
144; X86-NEXT: .LBB3_2: # %exit
145; X86-NEXT: popl %esi
146; X86-NEXT: retl
147entry:
148 %mul = shl i32 %b, 1
149 %add = add i32 %a, 4
150 %add1 = add i32 %add, %mul
151 %cmp = icmp ne i32 %add1 , 10
152 br i1 %cmp, label %mid , label %exit
153mid:
154 %addn = add i32 %a , 4
155 %mul2 = shl i32 %b, 3
156 %add4 = add i32 %addn, %mul2
157 %mul5 = mul nsw i32 %add1, %add4
158 br label %exit
159exit:
160 %retmul = phi i32 [%mul5 , %mid] , [0 , %entry]
161 ret i32 %retmul
162}