Skip to content

Commit 844b532

Browse files
authored
[MergeFunc] Handle ConstantRange attributes (#88584)
It is possible to update [AttributeImpl::operator<](https://github.com/andjo403/llvm-project/blob/a9da350aadfb5c86d36ae18398471558b22c1309/llvm/lib/IR/Attributes.cpp#L744) instead but feels strange to say that a range is less then an other range.
1 parent f6ca37b commit 844b532

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

llvm/lib/Transforms/Utils/FunctionComparator.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ int FunctionComparator::cmpAttrs(const AttributeList L,
143143
if (int Res = cmpNumbers((uint64_t)TyL, (uint64_t)TyR))
144144
return Res;
145145
continue;
146+
} else if (LA.isConstantRangeAttribute() &&
147+
RA.isConstantRangeAttribute()) {
148+
if (LA.getKindAsEnum() != RA.getKindAsEnum())
149+
return cmpNumbers(LA.getKindAsEnum(), RA.getKindAsEnum());
150+
151+
ConstantRange LCR = LA.getRange();
152+
ConstantRange RCR = RA.getRange();
153+
if (int Res = cmpAPInts(LCR.getLower(), RCR.getLower()))
154+
return Res;
155+
if (int Res = cmpAPInts(LCR.getUpper(), RCR.getUpper()))
156+
return Res;
157+
continue;
146158
}
147159
if (LA < RA)
148160
return -1;
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
; RUN: opt -passes=mergefunc -S < %s | FileCheck %s
2+
3+
define i8 @call_with_range_attr(i8 range(i8 0, 2) %v) {
4+
%out = call i8 @dummy2(i8 %v)
5+
ret i8 %out
6+
}
7+
8+
define i8 @call_no_range_attr(i8 %v) {
9+
; CHECK-LABEL: @call_no_range_attr
10+
; CHECK-NEXT: %out = call i8 @dummy2(i8 %v)
11+
; CHECK-NEXT: ret i8 %out
12+
%out = call i8 @dummy2(i8 %v)
13+
ret i8 %out
14+
}
15+
16+
define i8 @call_different_range_attr(i8 range(i8 5, 7) %v) {
17+
; CHECK-LABEL: @call_different_range_attr
18+
; CHECK-NEXT: %out = call i8 @dummy2(i8 %v)
19+
; CHECK-NEXT: ret i8 %out
20+
%out = call i8 @dummy2(i8 %v)
21+
ret i8 %out
22+
}
23+
24+
define i8 @call_with_range() {
25+
%out = call range(i8 0, 2) i8 @dummy()
26+
ret i8 %out
27+
}
28+
29+
define i8 @call_no_range() {
30+
; CHECK-LABEL: @call_no_range
31+
; CHECK-NEXT: %out = call i8 @dummy()
32+
; CHECK-NEXT: ret i8 %out
33+
%out = call i8 @dummy()
34+
ret i8 %out
35+
}
36+
37+
define i8 @call_different_range() {
38+
; CHECK-LABEL: @call_different_range
39+
; CHECK-NEXT: %out = call range(i8 5, 7) i8 @dummy()
40+
; CHECK-NEXT: ret i8 %out
41+
%out = call range(i8 5, 7) i8 @dummy()
42+
ret i8 %out
43+
}
44+
45+
define i8 @invoke_with_range() personality ptr undef {
46+
%out = invoke range(i8 0, 2) i8 @dummy() to label %next unwind label %lpad
47+
48+
next:
49+
ret i8 %out
50+
51+
lpad:
52+
%pad = landingpad { ptr, i32 } cleanup
53+
resume { ptr, i32 } zeroinitializer
54+
}
55+
56+
define i8 @invoke_no_range() personality ptr undef {
57+
; CHECK-LABEL: @invoke_no_range()
58+
; CHECK-NEXT: invoke i8 @dummy
59+
%out = invoke i8 @dummy() to label %next unwind label %lpad
60+
61+
next:
62+
ret i8 %out
63+
64+
lpad:
65+
%pad = landingpad { ptr, i32 } cleanup
66+
resume { ptr, i32 } zeroinitializer
67+
}
68+
69+
define i8 @invoke_different_range() personality ptr undef {
70+
; CHECK-LABEL: @invoke_different_range()
71+
; CHECK-NEXT: invoke range(i8 5, 7) i8 @dummy
72+
%out = invoke range(i8 5, 7) i8 @dummy() to label %next unwind label %lpad
73+
74+
next:
75+
ret i8 %out
76+
77+
lpad:
78+
%pad = landingpad { ptr, i32 } cleanup
79+
resume { ptr, i32 } zeroinitializer
80+
}
81+
82+
define i8 @invoke_with_same_range() personality ptr undef {
83+
; CHECK-LABEL: @invoke_with_same_range()
84+
; CHECK: tail call i8 @invoke_with_range()
85+
%out = invoke range(i8 0, 2) i8 @dummy() to label %next unwind label %lpad
86+
87+
next:
88+
ret i8 %out
89+
90+
lpad:
91+
%pad = landingpad { ptr, i32 } cleanup
92+
resume { ptr, i32 } zeroinitializer
93+
}
94+
95+
define i8 @call_with_same_range() {
96+
; CHECK-LABEL: @call_with_same_range
97+
; CHECK: tail call i8 @call_with_range
98+
%out = call range(i8 0, 2) i8 @dummy()
99+
ret i8 %out
100+
}
101+
102+
define i8 @call_with_same_range_attr(i8 range(i8 0, 2) %v) {
103+
; CHECK-LABEL: @call_with_same_range_attr
104+
; CHECK: tail call i8 @call_with_range_attr
105+
%out = call i8 @dummy2(i8 %v)
106+
ret i8 %out
107+
}
108+
109+
declare i8 @dummy();
110+
declare i8 @dummy2(i8);
111+
declare i32 @__gxx_personality_v0(...)

0 commit comments

Comments
 (0)