Skip to content

Commit cfa7924

Browse files
rotaterightzmodem
authored andcommitted
[Transforms] add phase ordering tests for min/max/abs; NFC
Test that instcombine and early-cse can cooperate to reduce sequences of select patterns that are not composed of the same underlying instructions. There's a bug in EarlyCSE (PR41083), and we can test how much a possible fix (D74285) may affect optimization. (cherry picked from commit 0ad6e72)
1 parent 52c365a commit cfa7924

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -S -O1 | FileCheck %s
3+
; RUN: opt -passes='default<O1>' -S < %s | FileCheck %s
4+
5+
; In all tests, expect instcombine to canonicalize the select patterns
6+
; for min/max/abs to allow CSE and subsequent simplification.
7+
8+
; sub (smax a,b), (smax a,b) --> 0
9+
10+
define i8 @smax_nsw(i8 %a, i8 %b) {
11+
; CHECK-LABEL: @smax_nsw(
12+
; CHECK-NEXT: ret i8 0
13+
;
14+
%sub = sub nsw i8 %a, %b
15+
%cmp1 = icmp slt i8 %a, %b
16+
%cmp2 = icmp sgt i8 %sub, 0
17+
%m1 = select i1 %cmp1, i8 0, i8 %sub
18+
%m2 = select i1 %cmp2, i8 %sub, i8 0
19+
%r = sub i8 %m2, %m1
20+
ret i8 %r
21+
}
22+
23+
; or (abs a), (abs a) --> abs a
24+
25+
define i8 @abs_swapped(i8 %a) {
26+
; CHECK-LABEL: @abs_swapped(
27+
; CHECK-NEXT: [[NEG:%.*]] = sub i8 0, [[A:%.*]]
28+
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A]], 0
29+
; CHECK-NEXT: [[M1:%.*]] = select i1 [[CMP1]], i8 [[NEG]], i8 [[A]]
30+
; CHECK-NEXT: ret i8 [[M1]]
31+
;
32+
%neg = sub i8 0, %a
33+
%cmp1 = icmp sgt i8 %a, 0
34+
%cmp2 = icmp slt i8 %a, 0
35+
%m1 = select i1 %cmp1, i8 %a, i8 %neg
36+
%m2 = select i1 %cmp2, i8 %neg, i8 %a
37+
%r = or i8 %m2, %m1
38+
ret i8 %r
39+
}
40+
41+
; xor (nabs a), (nabs a) --> 0
42+
43+
define i8 @nabs_swapped(i8 %a) {
44+
; CHECK-LABEL: @nabs_swapped(
45+
; CHECK-NEXT: ret i8 0
46+
;
47+
%neg = sub i8 0, %a
48+
%cmp1 = icmp slt i8 %a, 0
49+
%cmp2 = icmp sgt i8 %a, 0
50+
%m1 = select i1 %cmp1, i8 %a, i8 %neg
51+
%m2 = select i1 %cmp2, i8 %neg, i8 %a
52+
%r = xor i8 %m2, %m1
53+
ret i8 %r
54+
}
55+
56+
; xor (abs a), (abs a) --> 0
57+
58+
define i8 @abs_different_constants(i8 %a) {
59+
; CHECK-LABEL: @abs_different_constants(
60+
; CHECK-NEXT: ret i8 0
61+
;
62+
%neg = sub i8 0, %a
63+
%cmp1 = icmp sgt i8 %a, -1
64+
%cmp2 = icmp slt i8 %a, 0
65+
%m1 = select i1 %cmp1, i8 %a, i8 %neg
66+
%m2 = select i1 %cmp2, i8 %neg, i8 %a
67+
%r = xor i8 %m2, %m1
68+
ret i8 %r
69+
}
70+
71+
; or (nabs a), (nabs a) --> nabs a
72+
73+
define i8 @nabs_different_constants(i8 %a) {
74+
; CHECK-LABEL: @nabs_different_constants(
75+
; CHECK-NEXT: [[NEG:%.*]] = sub i8 0, [[A:%.*]]
76+
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i8 [[A]], 0
77+
; CHECK-NEXT: [[M1:%.*]] = select i1 [[CMP1]], i8 [[A]], i8 [[NEG]]
78+
; CHECK-NEXT: ret i8 [[M1]]
79+
;
80+
%neg = sub i8 0, %a
81+
%cmp1 = icmp slt i8 %a, 0
82+
%cmp2 = icmp sgt i8 %a, -1
83+
%m1 = select i1 %cmp1, i8 %a, i8 %neg
84+
%m2 = select i1 %cmp2, i8 %neg, i8 %a
85+
%r = or i8 %m2, %m1
86+
ret i8 %r
87+
}

0 commit comments

Comments
 (0)