blob: b69bdd5596feef79e92b3f829e06d03512b431b7 [file] [log] [blame]
Simon Pilgrim9961c552019-01-13 21:21:46 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE,SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=CHECK,SSE,SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,AVX,AVX512,AVX512F
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=CHECK,AVX,AVX512,AVX512BW
9
10declare i32 @llvm.uadd.sat.i32 (i32, i32)
11declare i64 @llvm.uadd.sat.i64 (i64, i64)
12declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
13
Simon Pilgrim67610922019-01-14 12:12:42 +000014; fold (uadd_sat c1, c2) -> c3
15define i32 @combine_constfold_i32() {
16; CHECK-LABEL: combine_constfold_i32:
17; CHECK: # %bb.0:
Simon Pilgrim67610922019-01-14 12:12:42 +000018; CHECK-NEXT: movl $-1, %eax
Simon Pilgrim67610922019-01-14 12:12:42 +000019; CHECK-NEXT: retq
20 %res = call i32 @llvm.uadd.sat.i32(i32 4294967295, i32 100)
21 ret i32 %res
22}
23
24define <8 x i16> @combine_constfold_v8i16() {
25; SSE-LABEL: combine_constfold_v8i16:
26; SSE: # %bb.0:
Simon Pilgrimcfa5f062019-01-14 12:34:31 +000027; SSE-NEXT: movaps {{.*#+}} xmm0 = [1,65535,256,65535,65535,65535,2,65535]
Simon Pilgrim67610922019-01-14 12:12:42 +000028; SSE-NEXT: retq
29;
30; AVX-LABEL: combine_constfold_v8i16:
31; AVX: # %bb.0:
Simon Pilgrimcfa5f062019-01-14 12:34:31 +000032; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [1,65535,256,65535,65535,65535,2,65535]
Simon Pilgrim67610922019-01-14 12:12:42 +000033; AVX-NEXT: retq
34 %res = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> <i16 0, i16 1, i16 255, i16 65535, i16 -1, i16 -255, i16 -65535, i16 1>, <8 x i16> <i16 1, i16 65535, i16 1, i16 65535, i16 1, i16 65535, i16 1, i16 65535>)
35 ret <8 x i16> %res
36}
37
Simon Pilgrimcfa5f062019-01-14 12:34:31 +000038define <8 x i16> @combine_constfold_undef_v8i16() {
39; SSE-LABEL: combine_constfold_undef_v8i16:
40; SSE: # %bb.0:
41; SSE-NEXT: movdqa {{.*#+}} xmm0 = <u,1,u,65535,65535,65281,1,1>
42; SSE-NEXT: paddusw {{.*}}(%rip), %xmm0
43; SSE-NEXT: retq
44;
45; AVX-LABEL: combine_constfold_undef_v8i16:
46; AVX: # %bb.0:
47; AVX-NEXT: vmovdqa {{.*#+}} xmm0 = <u,1,u,65535,65535,65281,1,1>
48; AVX-NEXT: vpaddusw {{.*}}(%rip), %xmm0, %xmm0
49; AVX-NEXT: retq
50 %res = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> <i16 undef, i16 1, i16 undef, i16 65535, i16 -1, i16 -255, i16 -65535, i16 1>, <8 x i16> <i16 1, i16 undef, i16 undef, i16 65535, i16 1, i16 65535, i16 1, i16 65535>)
51 ret <8 x i16> %res
52}
53
Simon Pilgrim9961c552019-01-13 21:21:46 +000054; fold (uadd_sat c, x) -> (add_ssat x, c)
55define i32 @combine_constant_i32(i32 %a0) {
56; CHECK-LABEL: combine_constant_i32:
57; CHECK: # %bb.0:
58; CHECK-NEXT: addl $1, %edi
59; CHECK-NEXT: movl $-1, %eax
60; CHECK-NEXT: cmovael %edi, %eax
61; CHECK-NEXT: retq
Simon Pilgrim67610922019-01-14 12:12:42 +000062 %1 = call i32 @llvm.uadd.sat.i32(i32 1, i32 %a0)
Simon Pilgrim9961c552019-01-13 21:21:46 +000063 ret i32 %1
64}
65
66define <8 x i16> @combine_constant_v8i16(<8 x i16> %a0) {
67; SSE-LABEL: combine_constant_v8i16:
68; SSE: # %bb.0:
69; SSE-NEXT: paddusw {{.*}}(%rip), %xmm0
70; SSE-NEXT: retq
71;
72; AVX-LABEL: combine_constant_v8i16:
73; AVX: # %bb.0:
74; AVX-NEXT: vpaddusw {{.*}}(%rip), %xmm0, %xmm0
75; AVX-NEXT: retq
Simon Pilgrim67610922019-01-14 12:12:42 +000076 %1 = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, <8 x i16> %a0)
Simon Pilgrim9961c552019-01-13 21:21:46 +000077 ret <8 x i16> %1
78}
79
80; fold (uadd_sat c, 0) -> x
81define i32 @combine_zero_i32(i32 %a0) {
82; CHECK-LABEL: combine_zero_i32:
83; CHECK: # %bb.0:
Simon Pilgrim897d4c62019-01-13 21:50:24 +000084; CHECK-NEXT: movl %edi, %eax
Simon Pilgrim9961c552019-01-13 21:21:46 +000085; CHECK-NEXT: retq
Simon Pilgrim67610922019-01-14 12:12:42 +000086 %1 = call i32 @llvm.uadd.sat.i32(i32 %a0, i32 0)
Simon Pilgrim9961c552019-01-13 21:21:46 +000087 ret i32 %1
88}
89
90define <8 x i16> @combine_zero_v8i16(<8 x i16> %a0) {
Simon Pilgrim897d4c62019-01-13 21:50:24 +000091; CHECK-LABEL: combine_zero_v8i16:
92; CHECK: # %bb.0:
93; CHECK-NEXT: retq
Simon Pilgrim67610922019-01-14 12:12:42 +000094 %1 = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %a0, <8 x i16> zeroinitializer)
Simon Pilgrim9961c552019-01-13 21:21:46 +000095 ret <8 x i16> %1
96}
97
98; fold (uadd_sat x, y) -> (add x, y) iff no overflow
99define i32 @combine_no_overflow_i32(i32 %a0, i32 %a1) {
100; CHECK-LABEL: combine_no_overflow_i32:
101; CHECK: # %bb.0:
Simon Pilgrim56ba1db2019-01-13 22:08:26 +0000102; CHECK-NEXT: # kill: def $esi killed $esi def $rsi
103; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
Simon Pilgrim9961c552019-01-13 21:21:46 +0000104; CHECK-NEXT: shrl $16, %edi
105; CHECK-NEXT: shrl $16, %esi
Simon Pilgrim56ba1db2019-01-13 22:08:26 +0000106; CHECK-NEXT: leal (%rsi,%rdi), %eax
Simon Pilgrim9961c552019-01-13 21:21:46 +0000107; CHECK-NEXT: retq
108 %1 = lshr i32 %a0, 16
109 %2 = lshr i32 %a1, 16
Simon Pilgrim67610922019-01-14 12:12:42 +0000110 %3 = call i32 @llvm.uadd.sat.i32(i32 %1, i32 %2)
Simon Pilgrim9961c552019-01-13 21:21:46 +0000111 ret i32 %3
112}
113
114define <8 x i16> @combine_no_overflow_v8i16(<8 x i16> %a0, <8 x i16> %a1) {
115; SSE-LABEL: combine_no_overflow_v8i16:
116; SSE: # %bb.0:
117; SSE-NEXT: psrlw $10, %xmm0
118; SSE-NEXT: psrlw $10, %xmm1
Simon Pilgrim56ba1db2019-01-13 22:08:26 +0000119; SSE-NEXT: paddw %xmm1, %xmm0
Simon Pilgrim9961c552019-01-13 21:21:46 +0000120; SSE-NEXT: retq
121;
122; AVX-LABEL: combine_no_overflow_v8i16:
123; AVX: # %bb.0:
124; AVX-NEXT: vpsrlw $10, %xmm0, %xmm0
125; AVX-NEXT: vpsrlw $10, %xmm1, %xmm1
Simon Pilgrim56ba1db2019-01-13 22:08:26 +0000126; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0
Simon Pilgrim9961c552019-01-13 21:21:46 +0000127; AVX-NEXT: retq
128 %1 = lshr <8 x i16> %a0, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>
129 %2 = lshr <8 x i16> %a1, <i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10, i16 10>
Simon Pilgrim67610922019-01-14 12:12:42 +0000130 %3 = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %1, <8 x i16> %2)
Simon Pilgrim9961c552019-01-13 21:21:46 +0000131 ret <8 x i16> %3
132}