xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/bool-simplify.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mattr=+sse4.1,-avx,+rdrnd,+rdseed | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(<2 x i64> %c, i32 %a, i32 %b) {
4*9880d681SAndroid Build Coastguard Worker  %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
5*9880d681SAndroid Build Coastguard Worker  %t2 = icmp ne i32 %t1, 0
6*9880d681SAndroid Build Coastguard Worker  %t3 = select i1 %t2, i32 %a, i32 %b
7*9880d681SAndroid Build Coastguard Worker  ret i32 %t3
8*9880d681SAndroid Build Coastguard Worker; CHECK: foo
9*9880d681SAndroid Build Coastguard Worker; CHECK: ptest
10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: testl
11*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
12*9880d681SAndroid Build Coastguard Worker; CHECK: ret
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdefine i32 @bar(<2 x i64> %c) {
16*9880d681SAndroid Build Coastguard Workerentry:
17*9880d681SAndroid Build Coastguard Worker  %0 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
18*9880d681SAndroid Build Coastguard Worker  %1 = icmp ne i32 %0, 0
19*9880d681SAndroid Build Coastguard Worker  br i1 %1, label %if-true-block, label %endif-block
20*9880d681SAndroid Build Coastguard Workerif-true-block:                                    ; preds = %entry
21*9880d681SAndroid Build Coastguard Worker  ret i32 0
22*9880d681SAndroid Build Coastguard Workerendif-block:                                      ; preds = %entry,
23*9880d681SAndroid Build Coastguard Worker  ret i32 1
24*9880d681SAndroid Build Coastguard Worker; CHECK: bar
25*9880d681SAndroid Build Coastguard Worker; CHECK: ptest
26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: testl
27*9880d681SAndroid Build Coastguard Worker; CHECK: jne
28*9880d681SAndroid Build Coastguard Worker; CHECK: ret
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i32 @bax(<2 x i64> %c) {
32*9880d681SAndroid Build Coastguard Worker  %t1 = call i32 @llvm.x86.sse41.ptestz(<2 x i64> %c, <2 x i64> %c)
33*9880d681SAndroid Build Coastguard Worker  %t2 = icmp eq i32 %t1, 1
34*9880d681SAndroid Build Coastguard Worker  %t3 = zext i1 %t2 to i32
35*9880d681SAndroid Build Coastguard Worker  ret i32 %t3
36*9880d681SAndroid Build Coastguard Worker; CHECK: bax
37*9880d681SAndroid Build Coastguard Worker; CHECK: ptest
38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmpl
39*9880d681SAndroid Build Coastguard Worker; CHECK: ret
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine i16 @rnd16(i16 %arg) nounwind uwtable {
43*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i16, i32 } @llvm.x86.rdrand.16() nounwind
44*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i16, i32 } %1, 0
45*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i16, i32 } %1, 1
46*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
47*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i16 0, i16 %arg
48*9880d681SAndroid Build Coastguard Worker  %6 = add i16 %5, %2
49*9880d681SAndroid Build Coastguard Worker  ret i16 %6
50*9880d681SAndroid Build Coastguard Worker; CHECK: rnd16
51*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand
52*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
54*9880d681SAndroid Build Coastguard Worker; CHECK: ret
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i32 @rnd32(i32 %arg) nounwind uwtable {
58*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i32, i32 } @llvm.x86.rdrand.32() nounwind
59*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i32, i32 } %1, 0
60*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i32, i32 } %1, 1
61*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
62*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i32 0, i32 %arg
63*9880d681SAndroid Build Coastguard Worker  %6 = add i32 %5, %2
64*9880d681SAndroid Build Coastguard Worker  ret i32 %6
65*9880d681SAndroid Build Coastguard Worker; CHECK: rnd32
66*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand
67*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
69*9880d681SAndroid Build Coastguard Worker; CHECK: ret
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine i64 @rnd64(i64 %arg) nounwind uwtable {
73*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i64, i32 } @llvm.x86.rdrand.64() nounwind
74*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i64, i32 } %1, 0
75*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i64, i32 } %1, 1
76*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
77*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i64 0, i64 %arg
78*9880d681SAndroid Build Coastguard Worker  %6 = add i64 %5, %2
79*9880d681SAndroid Build Coastguard Worker  ret i64 %6
80*9880d681SAndroid Build Coastguard Worker; CHECK: rnd64
81*9880d681SAndroid Build Coastguard Worker; CHECK: rdrand
82*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
84*9880d681SAndroid Build Coastguard Worker; CHECK: ret
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine i16 @seed16(i16 %arg) nounwind uwtable {
88*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i16, i32 } @llvm.x86.rdseed.16() nounwind
89*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i16, i32 } %1, 0
90*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i16, i32 } %1, 1
91*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
92*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i16 0, i16 %arg
93*9880d681SAndroid Build Coastguard Worker  %6 = add i16 %5, %2
94*9880d681SAndroid Build Coastguard Worker  ret i16 %6
95*9880d681SAndroid Build Coastguard Worker; CHECK: seed16
96*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed
97*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
98*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
99*9880d681SAndroid Build Coastguard Worker; CHECK: ret
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine i32 @seed32(i32 %arg) nounwind uwtable {
103*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i32, i32 } @llvm.x86.rdseed.32() nounwind
104*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i32, i32 } %1, 0
105*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i32, i32 } %1, 1
106*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
107*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i32 0, i32 %arg
108*9880d681SAndroid Build Coastguard Worker  %6 = add i32 %5, %2
109*9880d681SAndroid Build Coastguard Worker  ret i32 %6
110*9880d681SAndroid Build Coastguard Worker; CHECK: seed32
111*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed
112*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
114*9880d681SAndroid Build Coastguard Worker; CHECK: ret
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine i64 @seed64(i64 %arg) nounwind uwtable {
118*9880d681SAndroid Build Coastguard Worker  %1 = tail call { i64, i32 } @llvm.x86.rdseed.64() nounwind
119*9880d681SAndroid Build Coastguard Worker  %2 = extractvalue { i64, i32 } %1, 0
120*9880d681SAndroid Build Coastguard Worker  %3 = extractvalue { i64, i32 } %1, 1
121*9880d681SAndroid Build Coastguard Worker  %4 = icmp eq i32 %3, 0
122*9880d681SAndroid Build Coastguard Worker  %5 = select i1 %4, i64 0, i64 %arg
123*9880d681SAndroid Build Coastguard Worker  %6 = add i64 %5, %2
124*9880d681SAndroid Build Coastguard Worker  ret i64 %6
125*9880d681SAndroid Build Coastguard Worker; CHECK: seed64
126*9880d681SAndroid Build Coastguard Worker; CHECK: rdseed
127*9880d681SAndroid Build Coastguard Worker; CHECK: cmov
128*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov
129*9880d681SAndroid Build Coastguard Worker; CHECK: ret
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.x86.sse41.ptestz(<2 x i64>, <2 x i64>) nounwind readnone
133*9880d681SAndroid Build Coastguard Workerdeclare { i16, i32 } @llvm.x86.rdrand.16() nounwind
134*9880d681SAndroid Build Coastguard Workerdeclare { i32, i32 } @llvm.x86.rdrand.32() nounwind
135*9880d681SAndroid Build Coastguard Workerdeclare { i64, i32 } @llvm.x86.rdrand.64() nounwind
136*9880d681SAndroid Build Coastguard Workerdeclare { i16, i32 } @llvm.x86.rdseed.16() nounwind
137*9880d681SAndroid Build Coastguard Workerdeclare { i32, i32 } @llvm.x86.rdseed.32() nounwind
138*9880d681SAndroid Build Coastguard Workerdeclare { i64, i32 } @llvm.x86.rdseed.64() nounwind
139