From a0caa8de22a3ff475342796ecd3a4b2ea2a26cfe Mon Sep 17 00:00:00 2001 From: Rigidity Date: Sat, 6 Jul 2024 09:47:03 -0400 Subject: [PATCH] More optimizations --- crates/rue-compiler/src/optimizer.rs | 65 +++++++++++++-- tests.toml | 116 +++++++++++++-------------- 2 files changed, 118 insertions(+), 63 deletions(-) diff --git a/crates/rue-compiler/src/optimizer.rs b/crates/rue-compiler/src/optimizer.rs index 919d4aa..4d3204f 100644 --- a/crates/rue-compiler/src/optimizer.rs +++ b/crates/rue-compiler/src/optimizer.rs @@ -229,7 +229,18 @@ impl<'a> Optimizer<'a> { fn opt_add(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { let lhs = self.opt_mir(env_id, lhs); let rhs = self.opt_mir(env_id, rhs); - self.db.alloc_lir(Lir::Add(vec![lhs, rhs])) + let mut args = Vec::new(); + if let Lir::Add(lhs) = self.db.lir(lhs) { + args.extend(lhs); + } else { + args.push(lhs); + } + if let Lir::Add(rhs) = self.db.lir(rhs) { + args.extend(rhs); + } else { + args.push(rhs); + } + self.db.alloc_lir(Lir::Add(args)) } fn opt_subtract(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { @@ -241,7 +252,18 @@ impl<'a> Optimizer<'a> { fn opt_multiply(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { let lhs = self.opt_mir(env_id, lhs); let rhs = self.opt_mir(env_id, rhs); - self.db.alloc_lir(Lir::Mul(vec![lhs, rhs])) + let mut args = Vec::new(); + if let Lir::Mul(lhs) = self.db.lir(lhs) { + args.extend(lhs); + } else { + args.push(lhs); + } + if let Lir::Mul(rhs) = self.db.lir(rhs) { + args.extend(rhs); + } else { + args.push(rhs); + } + self.db.alloc_lir(Lir::Mul(args)) } fn opt_divide(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { @@ -316,7 +338,18 @@ impl<'a> Optimizer<'a> { fn opt_concat(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { let lhs = self.opt_mir(env_id, lhs); let rhs = self.opt_mir(env_id, rhs); - self.db.alloc_lir(Lir::Concat(vec![lhs, rhs])) + let mut args = Vec::new(); + if let Lir::Concat(lhs) = self.db.lir(lhs) { + args.extend(lhs); + } else { + args.push(lhs); + } + if let Lir::Concat(rhs) = self.db.lir(rhs) { + args.extend(rhs); + } else { + args.push(rhs); + } + self.db.alloc_lir(Lir::Concat(args)) } fn opt_point_add(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { @@ -338,13 +371,35 @@ impl<'a> Optimizer<'a> { fn opt_any(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { let lhs = self.opt_mir(env_id, lhs); let rhs = self.opt_mir(env_id, rhs); - self.db.alloc_lir(Lir::Any(vec![lhs, rhs])) + let mut args = Vec::new(); + if let Lir::Any(lhs) = self.db.lir(lhs) { + args.extend(lhs); + } else { + args.push(lhs); + } + if let Lir::Any(rhs) = self.db.lir(rhs) { + args.extend(rhs); + } else { + args.push(rhs); + } + self.db.alloc_lir(Lir::Any(args)) } fn opt_all(&mut self, env_id: EnvironmentId, lhs: MirId, rhs: MirId) -> LirId { let lhs = self.opt_mir(env_id, lhs); let rhs = self.opt_mir(env_id, rhs); - self.db.alloc_lir(Lir::All(vec![lhs, rhs])) + let mut args = Vec::new(); + if let Lir::All(lhs) = self.db.lir(lhs) { + args.extend(lhs); + } else { + args.push(lhs); + } + if let Lir::All(rhs) = self.db.lir(rhs) { + args.extend(rhs); + } else { + args.push(rhs); + } + self.db.alloc_lir(Lir::All(args)) } fn opt_not(&mut self, env_id: EnvironmentId, value: MirId) -> LirId { diff --git a/tests.toml b/tests.toml index 813da72..f5aa17d 100644 --- a/tests.toml +++ b/tests.toml @@ -10,11 +10,11 @@ output = "120" hash = "e287a4cdf0ee9e003ee4450c1408d162e08db92a141035bf3ff932d46ca87f93" [const_multiple_reference] -bytes = 77 -cost = 2805 +bytes = 65 +cost = 1672 input = "()" output = "\"Hello, Bob!\"" -hash = "ad1d14ebd66b8fad929ee4b816aa51410d12f987bbeabffd571d0701fe061281" +hash = "3e851b5ad6b5c395bd46219991d2c7bb113e91918a065c705cc9068445bcc2a7" [inline_function_cycle] parser_errors = [] @@ -32,11 +32,11 @@ parser_errors = [] compiler_errors = ["Error: Cannot recursively call inline function. (5:27)"] [mixed_consts] -bytes = 43 -cost = 2144 +bytes = 39 +cost = 1711 input = "()" output = "126" -hash = "834c349efb47a4863d393d9266c217f5b2ab0da53d1b4cd03b1df43ac19ca85f" +hash = "14870051d753aa4295466e166782fb5da7f18ad450a0ed0af9d7ccb83a82bed9" [inline_const_function_cycle] parser_errors = [] @@ -98,11 +98,11 @@ output = "0x288b694028" hash = "0f74e7fd57bb9a7e05cf979ee986a8e0120801d2b18019c275a9717fce22f379" [struct_optional_initializer] -bytes = 323 -cost = 50921 +bytes = 319 +cost = 43841 input = "()" output = "()" -hash = "7346d21032e40d7c691f7411e3d115810f167d1985389d65acf581670c230d0e" +hash = "6e01e2f4d94692686fd7696643431390d821103b211ae74e23def8b42031be97" [struct_single_optional] bytes = 83 @@ -119,11 +119,11 @@ output = "()" hash = "9d76d68d33ab457ba1482630892e687c2a062b6081d5a386b344696908bab9e8" [struct_optional] -bytes = 127 -cost = 5030 +bytes = 123 +cost = 4597 input = "()" output = "221" -hash = "cca28c8cd08bf5e84d1b51883b045c1018acc21064c8f82c5d0c223f5e1039a8" +hash = "f74e8a1315435c77b0677225e1e68bd3a92ba7048b1f9946b7cf9a1c723d787b" [struct] bytes = 37 @@ -140,11 +140,11 @@ output = "76" hash = "917b0e1ee2c8ad5755e1f97c4642ea653288acf816eee1b0d537dd8e01106711" [block_const] -bytes = 101 -cost = 4468 +bytes = 97 +cost = 4022 input = "()" output = "1168" -hash = "9417e13c05b85934e8a305f36ccc83bf55fec11978461c6ebb630b739f837c43" +hash = "09949696fa19e25b6dd9e208fd55fd96d22298930ea41668b1276d5280d67b43" [block_nested_raise] bytes = 21 @@ -155,11 +155,11 @@ hash = "6fdd7c92cc7f9e42a53e07e6123bb5267cc5cc08912d5cb8ed26925aa6fd9672" error = "\"Explicit raise\"" [block_let] -bytes = 47 -cost = 3460 +bytes = 39 +cost = 2581 input = "()" output = "1168" -hash = "3070c823a9d006d346744228f842e6f86692158d6afa8705d01a4be322a8e751" +hash = "4d0b3e7905efc3108e842985d16a05f6284e177cd8075c182ab11b99ba716f18" [block_raise] bytes = 21 @@ -195,11 +195,11 @@ output = "84" hash = "1a6d758fe06cbcd5d1911a5419c1308b52fc69c95872483506e28f6348b08a44" [block_inline_const] -bytes = 37 -cost = 3150 +bytes = 25 +cost = 1838 input = "()" output = "1168" -hash = "11efffdca3fc8786b6e51cc51f13a52e02fc6af181c5b7019424251ae785bd00" +hash = "6636275e009c26ccaba0bde1f76d4e1451f57462b1d2528a3a5df0a3202c1f78" [block_nested_return] parser_errors = [] @@ -227,18 +227,18 @@ output = "()" hash = "a904e8177e07f7f7c2454b8cb53017f85181b0b7841ba9275950e4d6151c9b84" [enum_mixed] -bytes = 279 -cost = 33360 +bytes = 275 +cost = 29112 input = "()" output = "()" -hash = "0af9a22b05c1ceb929e756159fb1c9dffbbc725179e6669ab4c00e712e0008ab" +hash = "951c93c0f57cdebc0c526b69556d6414c62d03be39bad27b08f27bddae98744d" [enum_empty] -bytes = 177 -cost = 12614 +bytes = 173 +cost = 11198 input = "()" output = "()" -hash = "b1a579071d1400cffb70369511e553d9ece5c6966bb03c5b19cd48bde773c8d5" +hash = "600c2c11a7ceb22fd3f5d2559d22120f9ad7e8d47e0966ddcfbcce20e02f373f" [function_call] parser_errors = [] @@ -279,11 +279,11 @@ compiler_errors = [ ] [struct_empty] -bytes = 165 +bytes = 161 cost = 4104 input = "()" output = "()" -hash = "bb2f6e4150d64965b692025d779786e459fc00ab5f7a6cf748315c5d470d64e6" +hash = "bf0ebac819c080030caeaaff2dde6b8382e18c39c30949a382368520e7026771" [birecursive_functions] bytes = 195 @@ -293,11 +293,11 @@ output = "()" hash = "770bb2c0b2582924adf403e62374f8424a2ed510eef70b5f450eccab238a4911" [inner_inline_functions] -bytes = 329 -cost = 16899 +bytes = 301 +cost = 15121 input = "()" output = "0x0a37e3fbe2" -hash = "921423faa6da77bee705fcefd72b1a48d260fd74f197a387c39168e2438cdc8b" +hash = "d0518a7a1bb65cb587cd00b19dc487cf8aae4950fdeea6a4e8c163962fd6ad81" [infer_generic_lambda] bytes = 65 @@ -379,25 +379,25 @@ output = "152" hash = "38b1cec180a0bc0f5ec91097cec51971df126e3b18af54ddba4a3e4a36f9c285" [std] -bytes = 832 -cost = 91299 +bytes = 828 +cost = 82803 input = "()" output = "()" -hash = "7eab50734f88cbad6a3794be152d314496d7ae932f39947f34a7884ab1492f67" +hash = "962d75284aa716681f671c5deac36f613c51b117f7625f3ece1310b590b79b34" [literal_bytes] -bytes = 371 -cost = 17954 +bytes = 367 +cost = 15830 input = "()" output = "0xf1fb6ca14066f4236b3cc44a79a78fe90d44f1d45e04f9b9939863db71b99560" -hash = "da23d6cdd53ce5a6807d40aa0a73b8d2d748a0e8684394e94681c00708f3e660" +hash = "14c7dd45e2f1dba24d5941e5b5ca95eb44dcaee423bf45a8edf8f8a1737ae674" [concat_bytes] -bytes = 42 -cost = 2500 +bytes = 30 +cost = 1159 input = "()" output = "\"Hello, world!\"" -hash = "6da79c81642d2949a1ca049098cd148cfb1ec7444a86cd6392fb46faf6e76391" +hash = "d30484c7f6402b6fe4ab2874dd328ff0c5385394e68d9743cc29ea36405c6961" [integer_separator] bytes = 6 @@ -449,11 +449,11 @@ output = "0x064cc0" hash = "96a314da556b577d15a2e0a2db42e3b7f22610ab4336ed86713716c5a029e787" [boolean_arithmetic] -bytes = 55 -cost = 4977 +bytes = 47 +cost = 3975 input = "()" output = "1" -hash = "bc9d13262f5a2ab4c0e75a62ade773d493a624e05248c596a58bd85d8466c68f" +hash = "7c0bf0b36503c7abd7e264b2d63cc829162cd1fdff59d1f34792cc043a24e9a5" [bitwise_shift] bytes = 41 @@ -493,18 +493,18 @@ compiler_errors = [ ] [p2_fusion] -bytes = 722 -cost = 87151 +bytes = 678 +cost = 69048 input = "((0x4696e7a2b7682e2df01ab47e6e002d0dca895f99c6172e4a55a3e033499532b7 0x32ed6e4964102d7093ef350019dfd14c99a3ea9feac1f3502194384b8976f7c1 0x770bb2c0b2582924adf403e62374f8424a2ed510eef70b5f450eccab238a4911) 0x8d496dc7cdbc417db2132eda6894b29a91511f176e93a1ea943d210cd27822b2 0x3878fc2ed6b703c7c3d00f9f5d8f170ec252ca439be6e5b5b516e1dce1adc0d7 0x3fe4d62a7db919b25377cb207f16fa0fb6519e123366eaa23014dd5d7c967ca2 0x837525fb91b88dbf02d9ef5a0b322f6943f93424b6e8fe6d26dd1be6d3311871 1 0xc19110971a0cea01368f0c7599b8984f74e301b7cda20bd7f86eb2296bbf16c5)" output = "((73 1) (72 0x6155f55414a5cd9193bef33744095a78d57852cf24241b25edeffad6e544c499) (63 0x9d6824bfdfb4c726334a210b657a5e4126c3fbb378598bb3a5b7a210bb75cdb8) (g1_negate 0xc19110971a0cea01368f0c7599b8984f74e301b7cda20bd7f86eb2296bbf16c5 1 (0xc19110971a0cea01368f0c7599b8984f74e301b7cda20bd7f86eb2296bbf16c5)) (60 0x81fdd3fbc407906bc0875522e7a2e77409ee5ef17d3eaa611b505b344588f6b6))" -hash = "1f6abfdd1000d9ed87740ca5a0a888a042d64a8a7b6d60f082aab5be1f0915b4" +hash = "2bd56215c0c88b31c1d488c5080ecf4a131a0bf52c99bb222869da2451ad7540" [multisig] -bytes = 489 -cost = 27062 +bytes = 485 +cost = 24230 input = "((0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) 1 (()) ((51 0x0000000000000000000000000000000000000000000000000000000000000000 1000)))" output = "((g1_multiply 0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0x502cea601814d49886e0713402860d6054f6947d811b3b93100c6b364626651a) (g1_negate 0x0000000000000000000000000000000000000000000000000000000000000000 1000))" -hash = "173385b87af5d8940767c328026fe5f8e76bc238d2a3aaddf4f55e844f400fca" +hash = "cc57ebae1e4370a56127589fa2808a5be775dc801b056cb60dbc950010cb0da4" [hello_world] bytes = 16 @@ -535,25 +535,25 @@ output = "((60 36) (73 0x0186a0) (g1_negate 0x42840c6aebec47ce2e01629ce381b461c1 hash = "7eb7bdb24d4069d7dc9787e7727ef4f0feef354712b1963667d475065122b9de" [p2_conditions] -bytes = 145 -cost = 18933 +bytes = 141 +cost = 16101 input = "(0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ((51 0x291e4594b43d58e833cab95e4b165c5fac6b4d8391c81ebfd20efdd8d58b92d8 1000)))" output = "((g1_multiply 0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0xc239bbcfc69fb5abacdd8dc174c6b33170c6d902dec3bc1c87662020cf044313) (g1_negate 0x291e4594b43d58e833cab95e4b165c5fac6b4d8391c81ebfd20efdd8d58b92d8 1000))" -hash = "e69958bce8b4294e16e9b54f6f6795228fbd6daa47ff27ab58a953c611367be2" +hash = "9bdda9e1aa36d402104334fad3d7d9ce5b7b507b92f985e24c21513a012f60c4" [p2_delegated_or_hidden] -bytes = 253 -cost = 24446 +bytes = 249 +cost = 20906 input = "(0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 () (q . ((51 0x291e4594b43d58e833cab95e4b165c5fac6b4d8391c81ebfd20efdd8d58b92d8 1000))) 1)" output = "((g1_multiply 0xc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0x3d7e1145b5969c12f4889f4f1f66bde0e4d3ba54b91784cf604294d162b44b69) (g1_negate 0x291e4594b43d58e833cab95e4b165c5fac6b4d8391c81ebfd20efdd8d58b92d8 1000))" -hash = "9b1c580707ca8282534c02c1a055427e0954818b6195a29f4442ac3e7ea8e8ee" +hash = "21f96d7bb1b15b83ce81dff3525d4c98793f906f6cc7ebba52a76524a7db6943" [singleton] -bytes = 1427 +bytes = 1395 cost = 0 input = "((0x42840c6aebec47ce2e01629ce381b461c19695264281a7b1aab5d4ff54506775 0x4696e7a2b7682e2df01ab47e6e002d0dca895f99c6172e4a55a3e033499532b7 0x291e4594b43d58e833cab95e4b165c5fac6b4d8391c81ebfd20efdd8d58b92d8) 1 (0x9b1c580707ca8282534c02c1a055427e0954818b6195a29f4442ac3e7ea8e8ee () 1) 1 ((51 0x173385b87af5d8940767c328026fe5f8e76bc238d2a3aaddf4f55e844f400fca 1)))" output = "()" -hash = "ca8bea1d975df6e382a60ef70f92d14de0eca974c548175adc6ee8c79597f91b" +hash = "37a397e01acadf7d7dc4266250055e482b4bcbd8f62469c9794b0e433983c8a0" error = "()" [enum_type_guard]