1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3
4define i32 @negate_nuw(i32 %x) {
5; CHECK-LABEL: negate_nuw:
6; CHECK:       # BB#0:
7; CHECK-NEXT:    xorl %eax, %eax
8; CHECK-NEXT:    retq
9;
10  %neg = sub nuw i32 0, %x
11  ret i32 %neg
12}
13
14define <4 x i32> @negate_nuw_vec(<4 x i32> %x) {
15; CHECK-LABEL: negate_nuw_vec:
16; CHECK:       # BB#0:
17; CHECK-NEXT:    xorps %xmm0, %xmm0
18; CHECK-NEXT:    retq
19;
20  %neg = sub nuw <4 x i32> zeroinitializer, %x
21  ret <4 x i32> %neg
22}
23
24define i8 @negate_zero_or_minsigned_nsw(i8 %x) {
25; CHECK-LABEL: negate_zero_or_minsigned_nsw:
26; CHECK:       # BB#0:
27; CHECK-NEXT:    xorl %eax, %eax
28; CHECK-NEXT:    retq
29;
30  %signbit = and i8 %x, 128
31  %neg = sub nsw i8 0, %signbit
32  ret i8 %neg
33}
34
35define <4 x i32> @negate_zero_or_minsigned_nsw_vec(<4 x i32> %x) {
36; CHECK-LABEL: negate_zero_or_minsigned_nsw_vec:
37; CHECK:       # BB#0:
38; CHECK-NEXT:    xorps %xmm0, %xmm0
39; CHECK-NEXT:    retq
40;
41  %signbit = shl <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31>
42  %neg = sub nsw <4 x i32> zeroinitializer, %signbit
43  ret <4 x i32> %neg
44}
45
46define i8 @negate_zero_or_minsigned(i8 %x) {
47; CHECK-LABEL: negate_zero_or_minsigned:
48; CHECK:       # BB#0:
49; CHECK-NEXT:    shlb $7, %dil
50; CHECK-NEXT:    movl %edi, %eax
51; CHECK-NEXT:    retq
52;
53  %signbit = shl i8 %x, 7
54  %neg = sub i8 0, %signbit
55  ret i8 %neg
56}
57
58define <4 x i32> @negate_zero_or_minsigned_vec(<4 x i32> %x) {
59; CHECK-LABEL: negate_zero_or_minsigned_vec:
60; CHECK:       # BB#0:
61; CHECK-NEXT:    andps {{.*}}(%rip), %xmm0
62; CHECK-NEXT:    retq
63;
64  %signbit = and <4 x i32> %x, <i32 2147483648, i32 2147483648, i32 2147483648, i32 2147483648>
65  %neg = sub <4 x i32> zeroinitializer, %signbit
66  ret <4 x i32> %neg
67}
68
69