Suggestion: optimizer should propagate file locations into invoke callee
- Dominant language
- C++
- Stars
- 1.9k
- Forks
- 283
- Avg merge
- 2d 10h
- Merged PRs (30d)
- 135
Description
I've noticed that the file/line that I get in optimized IR is the original in the function invoked, even if that function is invoked from multiple different places. This means that all the uses of that function get inlined with the same file/line information. I think it would be more useful if the file/line information came from the caller instead. See attached IR.
For example, the optimized IR:
fn my_package(a: bits[10], b: bits[10]) -> bits[10] {
test_aid2__2: bits[10] = add(a, b, id=287, pos=1,25,6)
ret test_aid2__3: bits[10] = add(test_aid2__2, b, id=290, pos=1,25,6)
}
The line 25 comes from the + operator in C++. I'd rather these be marked as lines 39 and 40:
template
class TestInt {
public:
template
TestInt(TestInt o)
: storage(o.storage) {
}
TestInt() {
}
#define MAX(a,b) (((a)>(b))?(a):(b))
template
TestInt operator+(TestInt o)const {
__xls_bits as = storage;
__xls_bits bs = o.storage;
TestInt ret;
asm ("fn (fid)(a: bits[i], b: bits[i]) -> bits[i] { ret test_(aid): bits[i] = add(a, b, pos=(loc)) }"
: "=r" (ret.storage)
: "i" (MAX(N,oN)+1), "id"(MAX(N,oN)), "parama" (as), "paramb" (bs)); // line 25
return ret;
}
private:
template
friend class TestInt;
__xls_bits storage;
};
TestInt<10> my_package(TestInt<10> a, TestInt<10> b) {
TestInt<10> r = a+b; // line 39
return r+b; // line 40
}
Unoptimized IR:
fn _ZN7TestIntILi10EEC1EOS0_(this: bits[10], implicit: bits[10]) -> (bits[10], bits[10]) {
ret tuple.6: (bits[10], bits[10]) = tuple(implicit, implicit, id=6, pos=1,5,7)
}
fn _ZN7TestIntILi10EEC1ILi11EEES_IXT_EE(this: bits[10], o: bits[11]) -> bits[10] {
bit_slice.10: bits[10] = bit_slice(o, start=0, width=10, id=10, pos=1,9,2)
ret identity.11: bits[10] = identity(bit_slice.10, id=11, pos=1,9,2)
}
fn _ZN7TestIntILi11EEC1EOS0_(this: bits[11], implicit: bits[11]) -> (bits[11], bits[11]) {
ret tuple.15: (bits[11], bits[11]) = tuple(implicit, implicit, id=15, pos=1,5,7)
}
fn _ZN7TestIntILi11EEC1Ev(this: bits[11]) -> bits[11] {
literal.22: bits[11] = literal(value=0, id=22, pos=1,14,2)
ret identity.23: bits[11] = identity(literal.22, id=23, pos=1,14,2)
}
fn fid1(a: bits[11], b: bits[11]) -> bits[11] {
ret test_aid2: bits[11] = add(a, b, id=27, pos=1,25,6)
}
fn _ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE(this: bits[10], o: bits[10]) -> bits[11] {
zero_ext.18: bits[11] = zero_ext(this, new_bit_count=11, id=18, pos=1,21,3)
zero_ext.19: bits[11] = zero_ext(o, new_bit_count=11, id=19, pos=1,22,3)
literal.29: bits[11] = literal(value=0, id=29, pos=1,28,6)
invoke.28: bits[11] = invoke(zero_ext.18, zero_ext.19, to_apply=fid1, id=28, pos=1,25,6)
invoke.30: (bits[11], bits[11]) = invoke(literal.29, invoke.28, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=30, pos=1,28,6)
literal.20: bits[11] = literal(value=0, id=20, pos=1,24,3)
literal.34: bits[1] = literal(value=1, id=34, pos=1,28,6)
tuple_index.31: bits[11] = tuple_index(invoke.30, index=0, id=31, pos=1,28,6)
invoke.24: bits[11] = invoke(literal.20, to_apply=_ZN7TestIntILi11EEC1Ev, id=24, pos=1,24,3)
tuple_index.32: bits[11] = tuple_index(invoke.30, index=1, id=32, pos=1,28,6)
literal.33: bits[1] = literal(value=1, id=33)
not.35: bits[1] = not(literal.34, id=35, pos=1,28,6)
ret identity.36: bits[11] = identity(tuple_index.31, id=36, pos=1,20,2)
}
fn _ZN7TestIntILi10EEC1ERKS0_(this: bits[10], implicit: bits[10]) -> bits[10] {
ret identity.40: bits[10] = identity(implicit, id=40, pos=1,5,7)
}
fn my_package(a: bits[10], b: bits[10]) -> bits[10] {
literal.37: bits[10] = literal(value=0, id=37, pos=1,39,2)
invoke.41: bits[10] = invoke(literal.37, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=41, pos=1,39,2)
literal.12: bits[11] = literal(value=0, id=12, pos=1,39,2)
invoke.44: bits[11] = invoke(a, invoke.41, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=44, pos=1,39,2)
invoke.50: (bits[11], bits[11]) = invoke(literal.12, invoke.44, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=50, pos=1,39,2)
literal.7: bits[10] = literal(value=0, id=7, pos=1,39,2)
tuple_index.51: bits[11] = tuple_index(invoke.50, index=0, id=51, pos=1,39,2)
literal.3: bits[10] = literal(value=0, id=3, pos=1,39,2)
invoke.67: bits[10] = invoke(literal.7, tuple_index.51, to_apply=_ZN7TestIntILi10EEC1ILi11EEES_IXT_EE, id=67, pos=1,39,2)
invoke.98: (bits[10], bits[10]) = invoke(literal.3, invoke.67, to_apply=_ZN7TestIntILi10EEC1EOS0_, id=98, pos=1,39,2)
literal.104: bits[10] = literal(value=0, id=104, pos=1,40,2)
tuple_index.99: bits[10] = tuple_index(invoke.98, index=0, id=99, pos=1,39,2)
invoke.105: bits[10] = invoke(literal.104, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=105, pos=1,40,2)
literal.103: bits[11] = literal(value=0, id=103, pos=1,40,2)
invoke.108: bits[11] = invoke(tuple_index.99, invoke.105, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=108, pos=1,40,2)
literal.70: bits[10] = literal(value=0, id=70, pos=1,39,2)
literal.134: bits[10] = literal(value=0, id=134, pos=1,40,2)
invoke.114: (bits[11], bits[11]) = invoke(literal.103, invoke.108, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=114, pos=1,40,2)
literal.54: bits[10] = literal(value=0, id=54, pos=1,39,2)
literal.84: bits[10] = literal(value=0, id=84, pos=1,39,2)
invoke.71: bits[10] = invoke(literal.70, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=71, pos=1,39,2)
literal.118: bits[10] = literal(value=0, id=118, pos=1,40,2)
literal.148: bits[10] = literal(value=0, id=148, pos=1,40,2)
invoke.135: bits[10] = invoke(literal.134, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=135, pos=1,40,2)
literal.102: bits[10] = literal(value=0, id=102, pos=1,40,2)
tuple_index.115: bits[11] = tuple_index(invoke.114, index=0, id=115, pos=1,40,2)
invoke.55: bits[10] = invoke(literal.54, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=55, pos=1,39,2)
invoke.85: bits[10] = invoke(literal.84, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=85, pos=1,39,2)
literal.69: bits[11] = literal(value=0, id=69, pos=1,39,2)
invoke.74: bits[11] = invoke(a, invoke.71, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=74, pos=1,39,2)
invoke.119: bits[10] = invoke(literal.118, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=119, pos=1,40,2)
invoke.149: bits[10] = invoke(literal.148, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=149, pos=1,40,2)
literal.133: bits[11] = literal(value=0, id=133, pos=1,40,2)
invoke.138: bits[11] = invoke(tuple_index.99, invoke.135, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=138, pos=1,40,2)
literal.101: bits[10] = literal(value=0, id=101, pos=1,40,2)
invoke.131: bits[10] = invoke(literal.102, tuple_index.115, to_apply=_ZN7TestIntILi10EEC1ILi11EEES_IXT_EE, id=131, pos=1,40,2)
literal.45: bits[10] = literal(value=0, id=45, pos=1,39,2)
literal.59: bits[10] = literal(value=0, id=59, pos=1,39,2)
literal.53: bits[11] = literal(value=0, id=53, pos=1,39,2)
invoke.58: bits[11] = invoke(a, invoke.55, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=58, pos=1,39,2)
literal.75: bits[10] = literal(value=0, id=75, pos=1,39,2)
literal.89: bits[10] = literal(value=0, id=89, pos=1,39,2)
literal.83: bits[11] = literal(value=0, id=83, pos=1,39,2)
invoke.88: bits[11] = invoke(a, invoke.85, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=88, pos=1,39,2)
invoke.80: (bits[11], bits[11]) = invoke(literal.69, invoke.74, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=80, pos=1,39,2)
literal.109: bits[10] = literal(value=0, id=109, pos=1,40,2)
literal.123: bits[10] = literal(value=0, id=123, pos=1,40,2)
literal.117: bits[11] = literal(value=0, id=117, pos=1,40,2)
invoke.122: bits[11] = invoke(tuple_index.99, invoke.119, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=122, pos=1,40,2)
literal.139: bits[10] = literal(value=0, id=139, pos=1,40,2)
literal.153: bits[10] = literal(value=0, id=153, pos=1,40,2)
literal.147: bits[11] = literal(value=0, id=147, pos=1,40,2)
invoke.152: bits[11] = invoke(tuple_index.99, invoke.149, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=152, pos=1,40,2)
invoke.144: (bits[11], bits[11]) = invoke(literal.133, invoke.138, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=144, pos=1,40,2)
invoke.162: (bits[10], bits[10]) = invoke(literal.101, invoke.131, to_apply=_ZN7TestIntILi10EEC1EOS0_, id=162, pos=1,40,2)
literal.42: bits[10] = literal(value=0, id=42, pos=1,39,2)
literal.47: bits[10] = literal(value=0, id=47, pos=1,39,2)
invoke.46: bits[10] = invoke(literal.45, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=46, pos=1,39,2)
literal.56: bits[10] = literal(value=0, id=56, pos=1,39,2)
literal.61: bits[10] = literal(value=0, id=61, pos=1,39,2)
invoke.60: bits[10] = invoke(literal.59, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=60, pos=1,39,2)
invoke.64: (bits[11], bits[11]) = invoke(literal.53, invoke.58, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=64, pos=1,39,2)
literal.72: bits[10] = literal(value=0, id=72, pos=1,39,2)
literal.77: bits[10] = literal(value=0, id=77, pos=1,39,2)
invoke.76: bits[10] = invoke(literal.75, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=76, pos=1,39,2)
literal.86: bits[10] = literal(value=0, id=86, pos=1,39,2)
literal.91: bits[10] = literal(value=0, id=91, pos=1,39,2)
invoke.90: bits[10] = invoke(literal.89, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=90, pos=1,39,2)
invoke.94: (bits[11], bits[11]) = invoke(literal.83, invoke.88, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=94, pos=1,39,2)
literal.68: bits[10] = literal(value=0, id=68, pos=1,39,2)
tuple_index.81: bits[11] = tuple_index(invoke.80, index=0, id=81, pos=1,39,2)
literal.106: bits[10] = literal(value=0, id=106, pos=1,40,2)
literal.111: bits[10] = literal(value=0, id=111, pos=1,40,2)
invoke.110: bits[10] = invoke(literal.109, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=110, pos=1,40,2)
literal.120: bits[10] = literal(value=0, id=120, pos=1,40,2)
literal.125: bits[10] = literal(value=0, id=125, pos=1,40,2)
invoke.124: bits[10] = invoke(literal.123, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=124, pos=1,40,2)
invoke.128: (bits[11], bits[11]) = invoke(literal.117, invoke.122, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=128, pos=1,40,2)
literal.136: bits[10] = literal(value=0, id=136, pos=1,40,2)
literal.141: bits[10] = literal(value=0, id=141, pos=1,40,2)
invoke.140: bits[10] = invoke(literal.139, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=140, pos=1,40,2)
literal.150: bits[10] = literal(value=0, id=150, pos=1,40,2)
literal.155: bits[10] = literal(value=0, id=155, pos=1,40,2)
invoke.154: bits[10] = invoke(literal.153, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=154, pos=1,40,2)
invoke.158: (bits[11], bits[11]) = invoke(literal.147, invoke.152, to_apply=_ZN7TestIntILi11EEC1EOS0_, id=158, pos=1,40,2)
literal.132: bits[10] = literal(value=0, id=132, pos=1,40,2)
tuple_index.145: bits[11] = tuple_index(invoke.144, index=0, id=145, pos=1,40,2)
literal.166: bits[1] = literal(value=1, id=166, pos=1,40,2)
tuple_index.163: bits[10] = tuple_index(invoke.162, index=0, id=163, pos=1,40,2)
invoke.43: bits[10] = invoke(literal.42, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=43, pos=1,39,2)
invoke.48: bits[10] = invoke(literal.47, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=48, pos=1,39,2)
invoke.49: bits[11] = invoke(a, invoke.46, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=49, pos=1,39,2)
tuple_index.52: bits[11] = tuple_index(invoke.50, index=1, id=52, pos=1,39,2)
invoke.57: bits[10] = invoke(literal.56, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=57, pos=1,39,2)
invoke.62: bits[10] = invoke(literal.61, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=62, pos=1,39,2)
invoke.63: bits[11] = invoke(a, invoke.60, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=63, pos=1,39,2)
tuple_index.65: bits[11] = tuple_index(invoke.64, index=0, id=65, pos=1,39,2)
tuple_index.66: bits[11] = tuple_index(invoke.64, index=1, id=66, pos=1,39,2)
invoke.73: bits[10] = invoke(literal.72, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=73, pos=1,39,2)
invoke.78: bits[10] = invoke(literal.77, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=78, pos=1,39,2)
invoke.79: bits[11] = invoke(a, invoke.76, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=79, pos=1,39,2)
tuple_index.82: bits[11] = tuple_index(invoke.80, index=1, id=82, pos=1,39,2)
invoke.87: bits[10] = invoke(literal.86, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=87, pos=1,39,2)
invoke.92: bits[10] = invoke(literal.91, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=92, pos=1,39,2)
invoke.93: bits[11] = invoke(a, invoke.90, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=93, pos=1,39,2)
tuple_index.95: bits[11] = tuple_index(invoke.94, index=0, id=95, pos=1,39,2)
tuple_index.96: bits[11] = tuple_index(invoke.94, index=1, id=96, pos=1,39,2)
invoke.97: bits[10] = invoke(literal.68, tuple_index.81, to_apply=_ZN7TestIntILi10EEC1ILi11EEES_IXT_EE, id=97, pos=1,39,2)
tuple_index.100: bits[10] = tuple_index(invoke.98, index=1, id=100, pos=1,39,2)
invoke.107: bits[10] = invoke(literal.106, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=107, pos=1,40,2)
invoke.112: bits[10] = invoke(literal.111, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=112, pos=1,40,2)
invoke.113: bits[11] = invoke(tuple_index.99, invoke.110, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=113, pos=1,40,2)
tuple_index.116: bits[11] = tuple_index(invoke.114, index=1, id=116, pos=1,40,2)
invoke.121: bits[10] = invoke(literal.120, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=121, pos=1,40,2)
invoke.126: bits[10] = invoke(literal.125, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=126, pos=1,40,2)
invoke.127: bits[11] = invoke(tuple_index.99, invoke.124, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=127, pos=1,40,2)
tuple_index.129: bits[11] = tuple_index(invoke.128, index=0, id=129, pos=1,40,2)
tuple_index.130: bits[11] = tuple_index(invoke.128, index=1, id=130, pos=1,40,2)
invoke.137: bits[10] = invoke(literal.136, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=137, pos=1,40,2)
invoke.142: bits[10] = invoke(literal.141, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=142, pos=1,40,2)
invoke.143: bits[11] = invoke(tuple_index.99, invoke.140, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=143, pos=1,40,2)
tuple_index.146: bits[11] = tuple_index(invoke.144, index=1, id=146, pos=1,40,2)
invoke.151: bits[10] = invoke(literal.150, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=151, pos=1,40,2)
invoke.156: bits[10] = invoke(literal.155, b, to_apply=_ZN7TestIntILi10EEC1ERKS0_, id=156, pos=1,40,2)
invoke.157: bits[11] = invoke(tuple_index.99, invoke.154, to_apply=_ZNK7TestIntILi10EEplILi10EEES_IXplqugtLi10ET_Li10ET_Li1EEES_IXT_EE, id=157, pos=1,40,2)
tuple_index.159: bits[11] = tuple_index(invoke.158, index=0, id=159, pos=1,40,2)
tuple_index.160: bits[11] = tuple_index(invoke.158, index=1, id=160, pos=1,40,2)
invoke.161: bits[10] = invoke(literal.132, tuple_index.145, to_apply=_ZN7TestIntILi10EEC1ILi11EEES_IXT_EE, id=161, pos=1,40,2)
tuple_index.164: bits[10] = tuple_index(invoke.162, index=1, id=164, pos=1,40,2)
literal.165: bits[1] = literal(value=1, id=165)
not.167: bits[1] = not(literal.166, id=167, pos=1,40,2)
ret identity.168: bits[10] = identity(tuple_index.163, id=168, pos=1,38,1)
}
Contributor guide
Assessment
This issue has not been assessed yet.