Skip to content

Commit d301378

Browse files
committed
Update CGP test
* Drop seemingly unnecessary IR * Check vector and ==/!= 1 cases * Check known-non-zero case for scalar types
1 parent 42dbb28 commit d301378

File tree

2 files changed

+181
-72
lines changed

2 files changed

+181
-72
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -p 'require<profile-summary>,function(codegenprepare)' -S %s \
3+
; RUN: | FileCheck %s --check-prefix=SLOW
4+
; RUN: opt -p 'require<profile-summary>,function(codegenprepare)' -S --mattr=+zvbb %s \
5+
; RUN: | FileCheck %s --check-prefix=FAST
6+
; REQUIRES: riscv-registered-target
7+
8+
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
9+
target triple = "riscv64"
10+
11+
define <4 x i1> @test_ult_2(<4 x i64> %x) {
12+
; SLOW-LABEL: define <4 x i1> @test_ult_2(
13+
; SLOW-SAME: <4 x i64> [[X:%.*]]) {
14+
; SLOW-NEXT: [[TMP0:%.*]] = add <4 x i64> [[X]], splat (i64 -1)
15+
; SLOW-NEXT: [[TMP1:%.*]] = and <4 x i64> [[X]], [[TMP0]]
16+
; SLOW-NEXT: [[CMP1:%.*]] = icmp eq <4 x i64> [[TMP1]], zeroinitializer
17+
; SLOW-NEXT: ret <4 x i1> [[CMP1]]
18+
;
19+
; FAST-LABEL: define <4 x i1> @test_ult_2(
20+
; FAST-SAME: <4 x i64> [[X:%.*]]) #[[ATTR0:[0-9]+]] {
21+
; FAST-NEXT: [[CTPOP:%.*]] = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> [[X]])
22+
; FAST-NEXT: [[CMP1:%.*]] = icmp ult <4 x i64> [[CTPOP]], splat (i64 2)
23+
; FAST-NEXT: ret <4 x i1> [[CMP1]]
24+
;
25+
%ctpop = call <4 x i64> @llvm.ctpop(<4 x i64> %x)
26+
%cmp = icmp ult <4 x i64> %ctpop, splat (i64 2)
27+
ret <4 x i1> %cmp
28+
}
29+
30+
define <4 x i1> @test_ugt_1(<4 x i64> %x) {
31+
; SLOW-LABEL: define <4 x i1> @test_ugt_1(
32+
; SLOW-SAME: <4 x i64> [[X:%.*]]) {
33+
; SLOW-NEXT: [[TMP0:%.*]] = add <4 x i64> [[X]], splat (i64 -1)
34+
; SLOW-NEXT: [[TMP1:%.*]] = and <4 x i64> [[X]], [[TMP0]]
35+
; SLOW-NEXT: [[CMP1:%.*]] = icmp ne <4 x i64> [[TMP1]], zeroinitializer
36+
; SLOW-NEXT: ret <4 x i1> [[CMP1]]
37+
;
38+
; FAST-LABEL: define <4 x i1> @test_ugt_1(
39+
; FAST-SAME: <4 x i64> [[X:%.*]]) #[[ATTR0]] {
40+
; FAST-NEXT: [[CTPOP:%.*]] = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> [[X]])
41+
; FAST-NEXT: [[CMP1:%.*]] = icmp ugt <4 x i64> [[CTPOP]], splat (i64 1)
42+
; FAST-NEXT: ret <4 x i1> [[CMP1]]
43+
;
44+
%ctpop = call <4 x i64> @llvm.ctpop(<4 x i64> %x)
45+
%cmp = icmp ugt <4 x i64> %ctpop, splat (i64 1)
46+
ret <4 x i1> %cmp
47+
}
48+
49+
define <4 x i1> @test_eq_1(<4 x i64> %x) {
50+
; SLOW-LABEL: define <4 x i1> @test_eq_1(
51+
; SLOW-SAME: <4 x i64> [[X:%.*]]) {
52+
; SLOW-NEXT: [[TMP0:%.*]] = add <4 x i64> [[X]], splat (i64 -1)
53+
; SLOW-NEXT: [[TMP1:%.*]] = xor <4 x i64> [[X]], [[TMP0]]
54+
; SLOW-NEXT: [[TMP2:%.*]] = icmp ugt <4 x i64> [[TMP1]], [[TMP0]]
55+
; SLOW-NEXT: ret <4 x i1> [[TMP2]]
56+
;
57+
; FAST-LABEL: define <4 x i1> @test_eq_1(
58+
; FAST-SAME: <4 x i64> [[X:%.*]]) #[[ATTR0]] {
59+
; FAST-NEXT: [[CTPOP:%.*]] = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> [[X]])
60+
; FAST-NEXT: [[CMP1:%.*]] = icmp eq <4 x i64> [[CTPOP]], splat (i64 1)
61+
; FAST-NEXT: ret <4 x i1> [[CMP1]]
62+
;
63+
%ctpop = call <4 x i64> @llvm.ctpop(<4 x i64> %x)
64+
%cmp = icmp eq <4 x i64> %ctpop, splat (i64 1)
65+
ret <4 x i1> %cmp
66+
}
67+
68+
define <4 x i1> @test_ne_1(<4 x i64> %x) {
69+
; SLOW-LABEL: define <4 x i1> @test_ne_1(
70+
; SLOW-SAME: <4 x i64> [[X:%.*]]) {
71+
; SLOW-NEXT: [[TMP0:%.*]] = add <4 x i64> [[X]], splat (i64 -1)
72+
; SLOW-NEXT: [[TMP1:%.*]] = xor <4 x i64> [[X]], [[TMP0]]
73+
; SLOW-NEXT: [[TMP2:%.*]] = icmp ule <4 x i64> [[TMP1]], [[TMP0]]
74+
; SLOW-NEXT: ret <4 x i1> [[TMP2]]
75+
;
76+
; FAST-LABEL: define <4 x i1> @test_ne_1(
77+
; FAST-SAME: <4 x i64> [[X:%.*]]) #[[ATTR0]] {
78+
; FAST-NEXT: [[CTPOP:%.*]] = call <4 x i64> @llvm.ctpop.v4i64(<4 x i64> [[X]])
79+
; FAST-NEXT: [[CMP1:%.*]] = icmp ne <4 x i64> [[CTPOP]], splat (i64 1)
80+
; FAST-NEXT: ret <4 x i1> [[CMP1]]
81+
;
82+
%ctpop = call <4 x i64> @llvm.ctpop(<4 x i64> %x)
83+
%cmp = icmp ne <4 x i64> %ctpop, splat (i64 1)
84+
ret <4 x i1> %cmp
85+
}

llvm/test/Transforms/CodeGenPrepare/unfold-pow2-test.ll

Lines changed: 96 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -3,97 +3,121 @@
33
; RUN: | FileCheck %s --check-prefix=SLOW
44
; RUN: opt -p 'require<profile-summary>,function(codegenprepare)' -S --mattr=+zbb %s \
55
; RUN: | FileCheck %s --check-prefix=FAST
6-
; REQUIRES: riscv64-registered-target
6+
; REQUIRES: riscv-registered-target
77

88
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
99
target triple = "riscv64"
1010

11-
define i64 @test_ult_2(i64 %x, i64 %y, i64 %a, i64 %b) {
12-
; SLOW-LABEL: define i64 @test_ult_2(
13-
; SLOW-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
14-
; SLOW-NEXT: [[ENTRY:.*]]:
11+
define i1 @test_ult_2(i64 %x) {
12+
; SLOW-LABEL: define i1 @test_ult_2(
13+
; SLOW-SAME: i64 [[X:%.*]]) {
14+
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
15+
; SLOW-NEXT: [[TMP1:%.*]] = and i64 [[X]], [[TMP0]]
16+
; SLOW-NEXT: [[CMP1:%.*]] = icmp eq i64 [[TMP1]], 0
17+
; SLOW-NEXT: ret i1 [[CMP1]]
18+
;
19+
; FAST-LABEL: define i1 @test_ult_2(
20+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
21+
; FAST-NEXT: [[CTPOP:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]])
22+
; FAST-NEXT: [[CMP1:%.*]] = icmp ult i64 [[CTPOP]], 2
23+
; FAST-NEXT: ret i1 [[CMP1]]
24+
;
25+
%ctpop = call i64 @llvm.ctpop(i64 %x)
26+
%cmp = icmp ult i64 %ctpop, 2
27+
ret i1 %cmp
28+
}
29+
30+
define i1 @test_ugt_1(i64 %x) {
31+
; SLOW-LABEL: define i1 @test_ugt_1(
32+
; SLOW-SAME: i64 [[X:%.*]]) {
1533
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
1634
; SLOW-NEXT: [[TMP1:%.*]] = and i64 [[X]], [[TMP0]]
1735
; SLOW-NEXT: [[CMP1:%.*]] = icmp ne i64 [[TMP1]], 0
18-
; SLOW-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[Y]], 0
19-
; SLOW-NEXT: [[CMP:%.*]] = or i1 [[CMP2]], [[CMP1]]
20-
; SLOW-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
21-
; SLOW: [[IF_THEN]]:
22-
; SLOW-NEXT: br label %[[IF_END]]
23-
; SLOW: [[IF_END]]:
24-
; SLOW-NEXT: [[RES:%.*]] = phi i64 [ [[A]], %[[IF_THEN]] ], [ [[B]], %[[ENTRY]] ]
25-
; SLOW-NEXT: ret i64 [[RES]]
36+
; SLOW-NEXT: ret i1 [[CMP1]]
2637
;
27-
; FAST-LABEL: define i64 @test_ult_2(
28-
; FAST-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0:[0-9]+]] {
29-
; FAST-NEXT: [[ENTRY:.*]]:
38+
; FAST-LABEL: define i1 @test_ugt_1(
39+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
3040
; FAST-NEXT: [[CTPOP:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]])
3141
; FAST-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[CTPOP]], 1
32-
; FAST-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[Y]], 0
33-
; FAST-NEXT: [[CMP:%.*]] = or i1 [[CMP2]], [[CMP1]]
34-
; FAST-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
35-
; FAST: [[IF_THEN]]:
36-
; FAST-NEXT: br label %[[IF_END]]
37-
; FAST: [[IF_END]]:
38-
; FAST-NEXT: [[RES:%.*]] = phi i64 [ [[A]], %[[IF_THEN]] ], [ [[B]], %[[ENTRY]] ]
39-
; FAST-NEXT: ret i64 [[RES]]
42+
; FAST-NEXT: ret i1 [[CMP1]]
4043
;
41-
entry:
42-
%ctpop = call i64 @llvm.ctpop.i64(i64 %x)
43-
%cmp1 = icmp ugt i64 %ctpop, 1
44-
%cmp2 = icmp sgt i64 %y, 0
45-
%cmp = or i1 %cmp2, %cmp1
46-
br i1 %cmp, label %if.then, label %if.end
47-
48-
if.then:
49-
br label %if.end
44+
%ctpop = call i64 @llvm.ctpop(i64 %x)
45+
%cmp = icmp ugt i64 %ctpop, 1
46+
ret i1 %cmp
47+
}
5048

51-
if.end:
52-
%res = phi i64 [ %a, %if.then ], [ %b, %entry ]
53-
ret i64 %res
49+
define i1 @test_eq_1_nz(i64 %x) {
50+
; SLOW-LABEL: define i1 @test_eq_1_nz(
51+
; SLOW-SAME: i64 [[X:%.*]]) {
52+
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
53+
; SLOW-NEXT: [[TMP1:%.*]] = and i64 [[X]], [[TMP0]]
54+
; SLOW-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 0
55+
; SLOW-NEXT: ret i1 [[TMP2]]
56+
;
57+
; FAST-LABEL: define i1 @test_eq_1_nz(
58+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
59+
; FAST-NEXT: [[CTPOP:%.*]] = call range(i64 1, 33) i64 @llvm.ctpop.i64(i64 [[X]])
60+
; FAST-NEXT: [[CMP1:%.*]] = icmp ult i64 [[CTPOP]], 2
61+
; FAST-NEXT: ret i1 [[CMP1]]
62+
;
63+
%ctpop = call range(i64 1, 33) i64 @llvm.ctpop(i64 %x)
64+
%cmp = icmp eq i64 %ctpop, 1
65+
ret i1 %cmp
5466
}
5567

56-
define i64 @test_ugt_1(i64 %x, i64 %y, i64 %a, i64 %b) {
57-
; SLOW-LABEL: define i64 @test_ugt_1(
58-
; SLOW-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
59-
; SLOW-NEXT: [[ENTRY:.*]]:
68+
define i1 @test_ne_1_nz(i64 %x) {
69+
; SLOW-LABEL: define i1 @test_ne_1_nz(
70+
; SLOW-SAME: i64 [[X:%.*]]) {
6071
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
6172
; SLOW-NEXT: [[TMP1:%.*]] = and i64 [[X]], [[TMP0]]
62-
; SLOW-NEXT: [[CMP1:%.*]] = icmp ne i64 [[TMP1]], 0
63-
; SLOW-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[Y]], 0
64-
; SLOW-NEXT: [[CMP:%.*]] = or i1 [[CMP2]], [[CMP1]]
65-
; SLOW-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
66-
; SLOW: [[IF_THEN]]:
67-
; SLOW-NEXT: br label %[[IF_END]]
68-
; SLOW: [[IF_END]]:
69-
; SLOW-NEXT: [[RES:%.*]] = phi i64 [ [[A]], %[[IF_THEN]] ], [ [[B]], %[[ENTRY]] ]
70-
; SLOW-NEXT: ret i64 [[RES]]
73+
; SLOW-NEXT: [[TMP2:%.*]] = icmp ne i64 [[TMP1]], 0
74+
; SLOW-NEXT: ret i1 [[TMP2]]
7175
;
72-
; FAST-LABEL: define i64 @test_ugt_1(
73-
; FAST-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) #[[ATTR0]] {
74-
; FAST-NEXT: [[ENTRY:.*]]:
75-
; FAST-NEXT: [[CTPOP:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]])
76+
; FAST-LABEL: define i1 @test_ne_1_nz(
77+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
78+
; FAST-NEXT: [[CTPOP:%.*]] = call range(i64 1, 33) i64 @llvm.ctpop.i64(i64 [[X]])
7679
; FAST-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[CTPOP]], 1
77-
; FAST-NEXT: [[CMP2:%.*]] = icmp sgt i64 [[Y]], 0
78-
; FAST-NEXT: [[CMP:%.*]] = or i1 [[CMP2]], [[CMP1]]
79-
; FAST-NEXT: br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
80-
; FAST: [[IF_THEN]]:
81-
; FAST-NEXT: br label %[[IF_END]]
82-
; FAST: [[IF_END]]:
83-
; FAST-NEXT: [[RES:%.*]] = phi i64 [ [[A]], %[[IF_THEN]] ], [ [[B]], %[[ENTRY]] ]
84-
; FAST-NEXT: ret i64 [[RES]]
80+
; FAST-NEXT: ret i1 [[CMP1]]
8581
;
86-
entry:
87-
%ctpop = call i64 @llvm.ctpop.i64(i64 %x)
88-
%cmp1 = icmp ugt i64 %ctpop, 1
89-
%cmp2 = icmp sgt i64 %y, 0
90-
%cmp = or i1 %cmp2, %cmp1
91-
br i1 %cmp, label %if.then, label %if.end
82+
%ctpop = call range(i64 1, 33) i64 @llvm.ctpop(i64 %x)
83+
%cmp = icmp ne i64 %ctpop, 1
84+
ret i1 %cmp
85+
}
9286

93-
if.then:
94-
br label %if.end
87+
define i1 @test_eq_1(i64 %x) {
88+
; SLOW-LABEL: define i1 @test_eq_1(
89+
; SLOW-SAME: i64 [[X:%.*]]) {
90+
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
91+
; SLOW-NEXT: [[TMP1:%.*]] = xor i64 [[X]], [[TMP0]]
92+
; SLOW-NEXT: [[TMP2:%.*]] = icmp ugt i64 [[TMP1]], [[TMP0]]
93+
; SLOW-NEXT: ret i1 [[TMP2]]
94+
;
95+
; FAST-LABEL: define i1 @test_eq_1(
96+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
97+
; FAST-NEXT: [[CTPOP:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]])
98+
; FAST-NEXT: [[CMP1:%.*]] = icmp eq i64 [[CTPOP]], 1
99+
; FAST-NEXT: ret i1 [[CMP1]]
100+
;
101+
%ctpop = call i64 @llvm.ctpop(i64 %x)
102+
%cmp = icmp eq i64 %ctpop, 1
103+
ret i1 %cmp
104+
}
95105

96-
if.end:
97-
%res = phi i64 [ %a, %if.then ], [ %b, %entry ]
98-
ret i64 %res
106+
define i1 @test_ne_1(i64 %x) {
107+
; SLOW-LABEL: define i1 @test_ne_1(
108+
; SLOW-SAME: i64 [[X:%.*]]) {
109+
; SLOW-NEXT: [[TMP0:%.*]] = add i64 [[X]], -1
110+
; SLOW-NEXT: [[TMP1:%.*]] = xor i64 [[X]], [[TMP0]]
111+
; SLOW-NEXT: [[TMP2:%.*]] = icmp ule i64 [[TMP1]], [[TMP0]]
112+
; SLOW-NEXT: ret i1 [[TMP2]]
113+
;
114+
; FAST-LABEL: define i1 @test_ne_1(
115+
; FAST-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
116+
; FAST-NEXT: [[CTPOP:%.*]] = call i64 @llvm.ctpop.i64(i64 [[X]])
117+
; FAST-NEXT: [[CMP1:%.*]] = icmp ne i64 [[CTPOP]], 1
118+
; FAST-NEXT: ret i1 [[CMP1]]
119+
;
120+
%ctpop = call i64 @llvm.ctpop(i64 %x)
121+
%cmp = icmp ne i64 %ctpop, 1
122+
ret i1 %cmp
99123
}

0 commit comments

Comments
 (0)