[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / bool-simplify.ll
blobedc36fd8b1446a01a5e4299d239095f21865608b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx,+rdrnd,+rdseed | FileCheck %s
4 define i32 @foo(<2 x i64> %c, i32 %a, i32 %b) {
5 ; CHECK-LABEL: foo:
6 ; CHECK:       # %bb.0:
7 ; CHECK-NEXT:    movl %edi, %eax
8 ; CHECK-NEXT:    ptest %xmm0, %xmm0
9 ; CHECK-NEXT:    cmovnel %esi, %eax
10 ; CHECK-NEXT:    retq
11   %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
12   %t2 = icmp ne i32 %t1, 0
13   %t3 = select i1 %t2, i32 %a, i32 %b
14   ret i32 %t3
17 define i32 @bar(<2 x i64> %c) {
18 ; CHECK-LABEL: bar:
19 ; CHECK:       # %bb.0: # %entry
20 ; CHECK-NEXT:    ptest %xmm0, %xmm0
21 ; CHECK-NEXT:    jne .LBB1_2
22 ; CHECK-NEXT:  # %bb.1: # %if-true-block
23 ; CHECK-NEXT:    xorl %eax, %eax
24 ; CHECK-NEXT:    retq
25 ; CHECK-NEXT:  .LBB1_2: # %endif-block
26 ; CHECK-NEXT:    movl $1, %eax
27 ; CHECK-NEXT:    retq
28 entry:
29   %0 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
30   %1 = icmp ne i32 %0, 0
31   br i1 %1, label %if-true-block, label %endif-block
32 if-true-block:
33   ret i32 0
34 endif-block:
35   ret i32 1
38 define i32 @bax(<2 x i64> %c) {
39 ; CHECK-LABEL: bax:
40 ; CHECK:       # %bb.0:
41 ; CHECK-NEXT:    xorl %eax, %eax
42 ; CHECK-NEXT:    ptest %xmm0, %xmm0
43 ; CHECK-NEXT:    sete %al
44 ; CHECK-NEXT:    retq
45   %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
46   %t2 = icmp eq i32 %t1, 1
47   %t3 = zext i1 %t2 to i32
48   ret i32 %t3
51 define i16 @rnd16(i16 %arg) nounwind {
52 ; CHECK-LABEL: rnd16:
53 ; CHECK:       # %bb.0:
54 ; CHECK-NEXT:    xorl %eax, %eax
55 ; CHECK-NEXT:    rdrandw %cx
56 ; CHECK-NEXT:    cmovbl %edi, %eax
57 ; CHECK-NEXT:    addl %ecx, %eax
58 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
59 ; CHECK-NEXT:    retq
60   %1 = tail call { i16, i32 } @llvm.x86.rdrand.16() nounwind
61   %2 = extractvalue { i16, i32 } %1, 0
62   %3 = extractvalue { i16, i32 } %1, 1
63   %4 = icmp eq i32 %3, 0
64   %5 = select i1 %4, i16 0, i16 %arg
65   %6 = add i16 %5, %2
66   ret i16 %6
69 define i32 @rnd32(i32 %arg) nounwind {
70 ; CHECK-LABEL: rnd32:
71 ; CHECK:       # %bb.0:
72 ; CHECK-NEXT:    xorl %eax, %eax
73 ; CHECK-NEXT:    rdrandl %ecx
74 ; CHECK-NEXT:    cmovbl %edi, %eax
75 ; CHECK-NEXT:    addl %ecx, %eax
76 ; CHECK-NEXT:    retq
77   %1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind
78   %2 = extractvalue { i32, i32 } %1, 0
79   %3 = extractvalue { i32, i32 } %1, 1
80   %4 = icmp eq i32 %3, 0
81   %5 = select i1 %4, i32 0, i32 %arg
82   %6 = add i32 %5, %2
83   ret i32 %6
86 define i64 @rnd64(i64 %arg) nounwind {
87 ; CHECK-LABEL: rnd64:
88 ; CHECK:       # %bb.0:
89 ; CHECK-NEXT:    xorl %eax, %eax
90 ; CHECK-NEXT:    rdrandq %rcx
91 ; CHECK-NEXT:    cmovbq %rdi, %rax
92 ; CHECK-NEXT:    addq %rcx, %rax
93 ; CHECK-NEXT:    retq
94   %1 = tail call { i64, i32 } @llvm.x86.rdrand.64() nounwind
95   %2 = extractvalue { i64, i32 } %1, 0
96   %3 = extractvalue { i64, i32 } %1, 1
97   %4 = icmp eq i32 %3, 0
98   %5 = select i1 %4, i64 0, i64 %arg
99   %6 = add i64 %5, %2
100   ret i64 %6
103 define i16 @seed16(i16 %arg) nounwind {
104 ; CHECK-LABEL: seed16:
105 ; CHECK:       # %bb.0:
106 ; CHECK-NEXT:    xorl %eax, %eax
107 ; CHECK-NEXT:    rdseedw %cx
108 ; CHECK-NEXT:    cmovbl %edi, %eax
109 ; CHECK-NEXT:    addl %ecx, %eax
110 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
111 ; CHECK-NEXT:    retq
112   %1 = tail call { i16, i32 } @llvm.x86.rdseed.16() nounwind
113   %2 = extractvalue { i16, i32 } %1, 0
114   %3 = extractvalue { i16, i32 } %1, 1
115   %4 = icmp eq i32 %3, 0
116   %5 = select i1 %4, i16 0, i16 %arg
117   %6 = add i16 %5, %2
118   ret i16 %6
121 define i32 @seed32(i32 %arg) nounwind {
122 ; CHECK-LABEL: seed32:
123 ; CHECK:       # %bb.0:
124 ; CHECK-NEXT:    xorl %eax, %eax
125 ; CHECK-NEXT:    rdseedl %ecx
126 ; CHECK-NEXT:    cmovbl %edi, %eax
127 ; CHECK-NEXT:    addl %ecx, %eax
128 ; CHECK-NEXT:    retq
129   %1 = tail call { i32, i32 } @llvm.x86.rdseed.32() nounwind
130   %2 = extractvalue { i32, i32 } %1, 0
131   %3 = extractvalue { i32, i32 } %1, 1
132   %4 = icmp eq i32 %3, 0
133   %5 = select i1 %4, i32 0, i32 %arg
134   %6 = add i32 %5, %2
135   ret i32 %6
138 define i64 @seed64(i64 %arg) nounwind {
139 ; CHECK-LABEL: seed64:
140 ; CHECK:       # %bb.0:
141 ; CHECK-NEXT:    xorl %eax, %eax
142 ; CHECK-NEXT:    rdseedq %rcx
143 ; CHECK-NEXT:    cmovbq %rdi, %rax
144 ; CHECK-NEXT:    addq %rcx, %rax
145 ; CHECK-NEXT:    retq
146   %1 = tail call { i64, i32 } @llvm.x86.rdseed.64() nounwind
147   %2 = extractvalue { i64, i32 } %1, 0
148   %3 = extractvalue { i64, i32 } %1, 1
149   %4 = icmp eq i32 %3, 0
150   %5 = select i1 %4, i64 0, i64 %arg
151   %6 = add i64 %5, %2
152   ret i64 %6
155 declare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone
156 declare { i16, i32 } @llvm.x86.rdrand.16() nounwind
157 declare { i32, i32 } @llvm.x86.rdrand.32() nounwind
158 declare { i64, i32 } @llvm.x86.rdrand.64() nounwind
159 declare { i16, i32 } @llvm.x86.rdseed.16() nounwind
160 declare { i32, i32 } @llvm.x86.rdseed.32() nounwind
161 declare { i64, i32 } @llvm.x86.rdseed.64() nounwind