xref: /llvm-project/llvm/test/CodeGen/X86/add-of-mul.ll (revision fe4dbbb4671eea11f8aaae2f5f3b485128e8c411)
1d3a2436bSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2d3a2436bSNikita Popov; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
3d3a2436bSNikita Popov
4d3a2436bSNikita Popovdefine i32 @test_scalar(i32 %x) {
5d3a2436bSNikita Popov; CHECK-LABEL: test_scalar:
6d3a2436bSNikita Popov; CHECK:       # %bb.0:
7d3a2436bSNikita Popov; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
8*fe4dbbb4SNikita Popov; CHECK-NEXT:    leal (,%rdi,4), %eax
9d3a2436bSNikita Popov; CHECK-NEXT:    retq
10d3a2436bSNikita Popov  %mul = mul i32 %x, 3
11d3a2436bSNikita Popov  %add = add i32 %mul, %x
12d3a2436bSNikita Popov  ret i32 %add
13d3a2436bSNikita Popov}
14d3a2436bSNikita Popov
15d4a58442SNikita Popovdefine i32 @test_scalar_commuted(i32 %x) {
16d4a58442SNikita Popov; CHECK-LABEL: test_scalar_commuted:
17d4a58442SNikita Popov; CHECK:       # %bb.0:
18d4a58442SNikita Popov; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
19*fe4dbbb4SNikita Popov; CHECK-NEXT:    leal (,%rdi,4), %eax
20d4a58442SNikita Popov; CHECK-NEXT:    retq
21d4a58442SNikita Popov  %mul = mul i32 %x, 3
22d4a58442SNikita Popov  %add = add i32 %x, %mul
23d4a58442SNikita Popov  ret i32 %add
24d4a58442SNikita Popov}
25d4a58442SNikita Popov
26d3a2436bSNikita Popovdefine <4 x i32> @test_vector(<4 x i32> %x) {
27d3a2436bSNikita Popov; CHECK-LABEL: test_vector:
28d3a2436bSNikita Popov; CHECK:       # %bb.0:
29*fe4dbbb4SNikita Popov; CHECK-NEXT:    pslld $2, %xmm0
30d3a2436bSNikita Popov; CHECK-NEXT:    retq
31d3a2436bSNikita Popov  %mul = mul <4 x i32> %x, <i32 3, i32 3, i32 3, i32 3>
32d3a2436bSNikita Popov  %add = add <4 x i32> %mul, %x
33d3a2436bSNikita Popov  ret <4 x i32> %add
34d3a2436bSNikita Popov}
35d3a2436bSNikita Popov
36d3a2436bSNikita Popovdefine ptr @test_ptr(ptr %p) {
37d3a2436bSNikita Popov; CHECK-LABEL: test_ptr:
38d3a2436bSNikita Popov; CHECK:       # %bb.0:
39*fe4dbbb4SNikita Popov; CHECK-NEXT:    leaq (,%rdi,4), %rax
40d3a2436bSNikita Popov; CHECK-NEXT:    retq
41d3a2436bSNikita Popov  %addr = ptrtoint ptr %p to i64
42d3a2436bSNikita Popov  %mul = mul i64 %addr, 3
43d3a2436bSNikita Popov  %res = getelementptr i8, ptr %p, i64 %mul
44d3a2436bSNikita Popov  ret ptr %res
45d3a2436bSNikita Popov}
46d3a2436bSNikita Popov
47d3a2436bSNikita Popovdefine i32 @test_extra_use(i32 %x, ptr %p) {
48d3a2436bSNikita Popov; CHECK-LABEL: test_extra_use:
49d3a2436bSNikita Popov; CHECK:       # %bb.0:
50d3a2436bSNikita Popov; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
51d3a2436bSNikita Popov; CHECK-NEXT:    leal (%rdi,%rdi,2), %eax
52d3a2436bSNikita Popov; CHECK-NEXT:    movl %eax, (%rsi)
53d3a2436bSNikita Popov; CHECK-NEXT:    addl %edi, %eax
54d3a2436bSNikita Popov; CHECK-NEXT:    retq
55d3a2436bSNikita Popov  %mul = mul i32 %x, 3
56d3a2436bSNikita Popov  store i32 %mul, ptr %p
57d3a2436bSNikita Popov  %add = add i32 %mul, %x
58d3a2436bSNikita Popov  ret i32 %add
59d3a2436bSNikita Popov}
60d3a2436bSNikita Popov
61d3a2436bSNikita Popovdefine i32 @test_different_operand(i32 %x, i32 %y) {
62d3a2436bSNikita Popov; CHECK-LABEL: test_different_operand:
63d3a2436bSNikita Popov; CHECK:       # %bb.0:
64d3a2436bSNikita Popov; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
65d3a2436bSNikita Popov; CHECK-NEXT:    leal (%rdi,%rdi,2), %eax
66d3a2436bSNikita Popov; CHECK-NEXT:    addl %esi, %eax
67d3a2436bSNikita Popov; CHECK-NEXT:    retq
68d3a2436bSNikita Popov  %mul = mul i32 %x, 3
69d3a2436bSNikita Popov  %add = add i32 %mul, %y
70d3a2436bSNikita Popov  ret i32 %add
71d3a2436bSNikita Popov}
72