xref: /llvm-project/llvm/test/CodeGen/PowerPC/logic-ops-on-compares.ll (revision 427fb35192f1f7bb694a5910b05abc5925a798b2)
1; XFAIL: *
2; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -O2 \
4; RUN:   -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
5; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
6; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O2 \
7; RUN:   -ppc-asm-full-reg-names -mcpu=pwr8 < %s | FileCheck %s \
8; RUN:  --implicit-check-not cmpw --implicit-check-not cmpd --implicit-check-not cmpl
9
10; Function Attrs: nounwind
11define signext i32 @logic_ne_32(i32 signext %a, i32 signext %b, i32 signext %c) {
12; CHECK-LABEL: logic_ne_32:
13; CHECK:    xor r7, r3, r4
14; CHECK-NEXT:    li r6, 55
15; CHECK-NEXT:    xor r5, r5, r6
16; CHECK-NEXT:    or r7, r7, r4
17; CHECK-NEXT:    cntlzw r5, r5
18; CHECK-NEXT:    cntlzw r6, r7
19; CHECK-NEXT:    srwi r6, r6, 5
20; CHECK-NEXT:    srwi r5, r5, 5
21; CHECK-NEXT:    or. r5, r6, r5
22; CHECK-NEXT:    bc 4, gt
23entry:
24  %tobool = icmp eq i32 %a, %b
25  %tobool1 = icmp eq i32 %b, 0
26  %or.cond = and i1 %tobool, %tobool1
27  %tobool3 = icmp eq i32 %c, 55
28  %or.cond5 = or i1 %or.cond, %tobool3
29  br i1 %or.cond5, label %if.end, label %if.then
30
31if.then:                                          ; preds = %entry
32  %call = tail call signext i32 @foo(i32 signext %a) #2
33  br label %return
34
35if.end:                                           ; preds = %entry
36  %call4 = tail call signext i32 @bar(i32 signext %b) #2
37  br label %return
38
39return:                                           ; preds = %if.end, %if.then
40  %retval.0 = phi i32 [ %call4, %if.end ], [ %call, %if.then ]
41  ret i32 %retval.0
42}
43
44define void @neg_truncate_i32_eq(ptr %ptr) {
45; CHECK-LABEL: neg_truncate_i32_eq:
46; CHECK:       # %bb.0: # %entry
47; CHECK-NEXT:    lwz r3, 0(r3)
48; CHECK-NEXT:    rldicl. r3, r3, 0, 63
49; CHECK-NEXT:    bclr 12, eq, 0
50; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
51entry:
52  %0 = load i32, ptr %ptr, align 4
53  %rem17127 = and i32 %0, 1
54  %cmp18 = icmp eq i32 %rem17127, 0
55  br label %if.else
56
57if.else:                                          ; preds = %entry
58  br i1 %cmp18, label %if.end29, label %if.end29.thread136
59
60if.end29.thread136:                               ; preds = %if.else
61  unreachable
62
63if.end29:                                         ; preds = %if.else
64  ret void
65
66}
67
68; Function Attrs: nounwind
69define i64 @logic_eq_64(i64 %a, i64 %b, i64 %c) {
70; CHECK-LABEL: logic_eq_64:
71; CHECK:    xor r7, r3, r4
72; CHECK-NEXT:    li r6, 55
73; CHECK-NEXT:    xor r5, r5, r6
74; CHECK-NEXT:    or r7, r7, r4
75; CHECK-NEXT:    cntlzd r6, r7
76; CHECK-NEXT:    cntlzd r5, r5
77; CHECK-NEXT:    rldicl r6, r6, 58, 63
78; CHECK-NEXT:    rldicl r5, r5, 58, 63
79; CHECK-NEXT:    or. r5, r6, r5
80; CHECK-NEXT:    bc 4, gt
81entry:
82  %tobool = icmp eq i64 %a, %b
83  %tobool1 = icmp eq i64 %b, 0
84  %or.cond = and i1 %tobool, %tobool1
85  %tobool3 = icmp eq i64 %c, 55
86  %or.cond5 = or i1 %or.cond, %tobool3
87  br i1 %or.cond5, label %if.end, label %if.then
88
89if.then:                                          ; preds = %entry
90  %call = tail call i64 @foo64(i64 %a) #2
91  br label %return
92
93if.end:                                           ; preds = %entry
94  %call4 = tail call i64 @bar64(i64 %b) #2
95  br label %return
96
97return:                                           ; preds = %if.end, %if.then
98  %retval.0 = phi i64 [ %call4, %if.end ], [ %call, %if.then ]
99  ret i64 %retval.0
100}
101
102define void @neg_truncate_i64_eq(ptr %ptr) {
103; CHECK-LABEL: neg_truncate_i64_eq:
104; CHECK:       # %bb.0: # %entry
105; CHECK-NEXT:    ld r3, 0(r3)
106; CHECK-NEXT:    rldicl. r3, r3, 0, 63
107; CHECK-NEXT:    bclr 12, eq, 0
108; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
109entry:
110  %0 = load i64, ptr %ptr, align 4
111  %rem17127 = and i64 %0, 1
112  %cmp18 = icmp eq i64 %rem17127, 0
113  br label %if.else
114
115if.else:                                          ; preds = %entry
116  br i1 %cmp18, label %if.end29, label %if.end29.thread136
117
118if.end29.thread136:                               ; preds = %if.else
119  unreachable
120
121if.end29:                                         ; preds = %if.else
122  ret void
123
124}
125
126; Function Attrs: nounwind
127define i64 @logic_ne_64(i64 %a, i64 %b, i64 %c) {
128; CHECK-LABEL: logic_ne_64:
129; CHECK:    xor r7, r3, r4
130; CHECK-NEXT:    li r6, 55
131; CHECK-NEXT:    addic r8, r7, -1
132; CHECK-NEXT:    xor r5, r5, r6
133; CHECK-NEXT:    subfe r7, r8, r7
134; CHECK-NEXT:    cntlzd r5, r5
135; CHECK-NEXT:    addic r12, r4, -1
136; CHECK-NEXT:    rldicl r5, r5, 58, 63
137; CHECK-NEXT:    subfe r6, r12, r4
138; CHECK-NEXT:    and r6, r7, r6
139; CHECK-NEXT:    or. r5, r6, r5
140; CHECK-NEXT:    bc 4, gt
141entry:
142  %tobool = icmp ne i64 %a, %b
143  %tobool1 = icmp ne i64 %b, 0
144  %or.cond = and i1 %tobool, %tobool1
145  %tobool3 = icmp eq i64 %c, 55
146  %or.cond5 = or i1 %or.cond, %tobool3
147  br i1 %or.cond5, label %if.end, label %if.then
148
149if.then:                                          ; preds = %entry
150  %call = tail call i64 @foo64(i64 %a) #2
151  br label %return
152
153if.end:                                           ; preds = %entry
154  %call4 = tail call i64 @bar64(i64 %b) #2
155  br label %return
156
157return:                                           ; preds = %if.end, %if.then
158  %retval.0 = phi i64 [ %call4, %if.end ], [ %call, %if.then ]
159  ret i64 %retval.0
160}
161
162define void @neg_truncate_i64_ne(ptr %ptr) {
163; CHECK-LABEL: neg_truncate_i64_ne:
164; CHECK:       # %bb.0: # %entry
165; CHECK-NEXT:    ld r3, 0(r3)
166; CHECK-NEXT:    andi. r3, r3, 1
167; CHECK-NEXT:    bclr 12, gt, 0
168; CHECK-NEXT:  # %bb.1: # %if.end29.thread136
169entry:
170  %0 = load i64, ptr %ptr, align 4
171  %rem17127 = and i64 %0, 1
172  %cmp18 = icmp ne i64 %rem17127, 0
173  br label %if.else
174
175if.else:                                          ; preds = %entry
176  br i1 %cmp18, label %if.end29, label %if.end29.thread136
177
178if.end29.thread136:                               ; preds = %if.else
179  unreachable
180
181if.end29:                                         ; preds = %if.else
182  ret void
183
184}
185
186declare signext i32 @foo(i32 signext)
187declare signext i32 @bar(i32 signext)
188declare i64 @foo64(i64)
189declare i64 @bar64(i64)
190