-
Notifications
You must be signed in to change notification settings - Fork 14k
Open
Labels
A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.C-bugCategory: This is a bug.Category: This is a bug.C-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing suchCategory: An issue highlighting optimization opportunities or PRs implementing suchI-heavyIssue: Problems and improvements with respect to binary size of generated code.Issue: Problems and improvements with respect to binary size of generated code.
Description
Take for instance nix::errno::Errno which has 132 variants. When passing -Copt-level=3:
llvm-ir
; <example::Errno as core::fmt::Debug>::fmt
; Function Attrs: nounwind nonlazybind
define noundef zeroext i1 @"_ZN51_$LT$example..Errno$u20$as$u20$core..fmt..Debug$GT$3fmt17h9b36b344bd3d49feE"(ptr noalias nocapture noundef readonly align 1 dereferenceable(1) %self, ptr noalias noundef align 8 dereferenceable(64) %f) unnamed_addr #0 {
start:
%0 = load i8, ptr %self, align 1, !range !3, !noundef !4
switch i8 %0, label %bb2 [
i8 0, label %bb134
i8 1, label %bb4
i8 2, label %bb5
i8 3, label %bb6
i8 4, label %bb7
i8 5, label %bb8
i8 6, label %bb9
i8 7, label %bb10
i8 8, label %bb11
i8 9, label %bb12
i8 10, label %bb13
i8 11, label %bb14
i8 12, label %bb15
i8 13, label %bb16
i8 14, label %bb17
i8 15, label %bb18
i8 16, label %bb19
i8 17, label %bb20
i8 18, label %bb21
i8 19, label %bb22
i8 20, label %bb23
i8 21, label %bb24
i8 22, label %bb25
i8 23, label %bb26
i8 24, label %bb27
i8 25, label %bb28
i8 26, label %bb29
i8 27, label %bb30
i8 28, label %bb31
i8 29, label %bb32
i8 30, label %bb33
i8 31, label %bb34
i8 32, label %bb35
i8 33, label %bb36
i8 34, label %bb37
i8 35, label %bb38
i8 36, label %bb39
i8 37, label %bb40
i8 38, label %bb41
i8 39, label %bb42
i8 40, label %bb43
i8 41, label %bb44
i8 42, label %bb45
i8 43, label %bb46
i8 44, label %bb47
i8 45, label %bb48
i8 46, label %bb49
i8 47, label %bb50
i8 48, label %bb51
i8 49, label %bb52
i8 50, label %bb53
i8 51, label %bb54
i8 52, label %bb55
i8 53, label %bb56
i8 54, label %bb57
i8 55, label %bb58
i8 56, label %bb59
i8 57, label %bb60
i8 58, label %bb61
i8 59, label %bb62
i8 60, label %bb63
i8 61, label %bb64
i8 62, label %bb65
i8 63, label %bb66
i8 64, label %bb67
i8 65, label %bb68
i8 66, label %bb69
i8 67, label %bb70
i8 68, label %bb71
i8 69, label %bb72
i8 70, label %bb73
i8 71, label %bb74
i8 72, label %bb75
i8 73, label %bb76
i8 74, label %bb77
i8 75, label %bb78
i8 76, label %bb79
i8 77, label %bb80
i8 78, label %bb81
i8 79, label %bb82
i8 80, label %bb83
i8 81, label %bb84
i8 82, label %bb85
i8 83, label %bb86
i8 84, label %bb87
i8 85, label %bb88
i8 86, label %bb89
i8 87, label %bb90
i8 88, label %bb91
i8 89, label %bb92
i8 90, label %bb93
i8 91, label %bb94
i8 92, label %bb95
i8 93, label %bb96
i8 94, label %bb97
i8 95, label %bb98
i8 96, label %bb99
i8 97, label %bb100
i8 98, label %bb101
i8 99, label %bb102
i8 100, label %bb103
i8 101, label %bb104
i8 102, label %bb105
i8 103, label %bb106
i8 104, label %bb107
i8 105, label %bb108
i8 106, label %bb109
i8 107, label %bb110
i8 108, label %bb111
i8 109, label %bb112
i8 110, label %bb113
i8 111, label %bb114
i8 112, label %bb115
i8 113, label %bb116
i8 114, label %bb117
i8 115, label %bb118
i8 116, label %bb119
i8 117, label %bb120
i8 118, label %bb121
i8 119, label %bb122
i8 120, label %bb123
i8 121, label %bb124
i8 122, label %bb125
i8 123, label %bb126
i8 124, label %bb127
i8 125, label %bb128
i8 126, label %bb129
i8 127, label %bb130
i8 -128, label %bb131
i8 -127, label %bb132
i8 -126, label %bb133
i8 -125, label %bb1
]
bb2: ; preds = %start
unreachable
bb4: ; preds = %start
br label %bb134
bb5: ; preds = %start
br label %bb134
bb6: ; preds = %start
br label %bb134
bb7: ; preds = %start
br label %bb134
bb8: ; preds = %start
br label %bb134
bb9: ; preds = %start
br label %bb134
bb10: ; preds = %start
br label %bb134
bb11: ; preds = %start
br label %bb134
bb12: ; preds = %start
br label %bb134
bb13: ; preds = %start
br label %bb134
bb14: ; preds = %start
br label %bb134
bb15: ; preds = %start
br label %bb134
bb16: ; preds = %start
br label %bb134
bb17: ; preds = %start
br label %bb134
bb18: ; preds = %start
br label %bb134
bb19: ; preds = %start
br label %bb134
bb20: ; preds = %start
br label %bb134
bb21: ; preds = %start
br label %bb134
bb22: ; preds = %start
br label %bb134
bb23: ; preds = %start
br label %bb134
bb24: ; preds = %start
br label %bb134
bb25: ; preds = %start
br label %bb134
bb26: ; preds = %start
br label %bb134
bb27: ; preds = %start
br label %bb134
bb28: ; preds = %start
br label %bb134
bb29: ; preds = %start
br label %bb134
bb30: ; preds = %start
br label %bb134
bb31: ; preds = %start
br label %bb134
bb32: ; preds = %start
br label %bb134
bb33: ; preds = %start
br label %bb134
bb34: ; preds = %start
br label %bb134
bb35: ; preds = %start
br label %bb134
bb36: ; preds = %start
br label %bb134
bb37: ; preds = %start
br label %bb134
bb38: ; preds = %start
br label %bb134
bb39: ; preds = %start
br label %bb134
bb40: ; preds = %start
br label %bb134
bb41: ; preds = %start
br label %bb134
bb42: ; preds = %start
br label %bb134
bb43: ; preds = %start
br label %bb134
bb44: ; preds = %start
br label %bb134
bb45: ; preds = %start
br label %bb134
bb46: ; preds = %start
br label %bb134
bb47: ; preds = %start
br label %bb134
bb48: ; preds = %start
br label %bb134
bb49: ; preds = %start
br label %bb134
bb50: ; preds = %start
br label %bb134
bb51: ; preds = %start
br label %bb134
bb52: ; preds = %start
br label %bb134
bb53: ; preds = %start
br label %bb134
bb54: ; preds = %start
br label %bb134
bb55: ; preds = %start
br label %bb134
bb56: ; preds = %start
br label %bb134
bb57: ; preds = %start
br label %bb134
bb58: ; preds = %start
br label %bb134
bb59: ; preds = %start
br label %bb134
bb60: ; preds = %start
br label %bb134
bb61: ; preds = %start
br label %bb134
bb62: ; preds = %start
br label %bb134
bb63: ; preds = %start
br label %bb134
bb64: ; preds = %start
br label %bb134
bb65: ; preds = %start
br label %bb134
bb66: ; preds = %start
br label %bb134
bb67: ; preds = %start
br label %bb134
bb68: ; preds = %start
br label %bb134
bb69: ; preds = %start
br label %bb134
bb70: ; preds = %start
br label %bb134
bb71: ; preds = %start
br label %bb134
bb72: ; preds = %start
br label %bb134
bb73: ; preds = %start
br label %bb134
bb74: ; preds = %start
br label %bb134
bb75: ; preds = %start
br label %bb134
bb76: ; preds = %start
br label %bb134
bb77: ; preds = %start
br label %bb134
bb78: ; preds = %start
br label %bb134
bb79: ; preds = %start
br label %bb134
bb80: ; preds = %start
br label %bb134
bb81: ; preds = %start
br label %bb134
bb82: ; preds = %start
br label %bb134
bb83: ; preds = %start
br label %bb134
bb84: ; preds = %start
br label %bb134
bb85: ; preds = %start
br label %bb134
bb86: ; preds = %start
br label %bb134
bb87: ; preds = %start
br label %bb134
bb88: ; preds = %start
br label %bb134
bb89: ; preds = %start
br label %bb134
bb90: ; preds = %start
br label %bb134
bb91: ; preds = %start
br label %bb134
bb92: ; preds = %start
br label %bb134
bb93: ; preds = %start
br label %bb134
bb94: ; preds = %start
br label %bb134
bb95: ; preds = %start
br label %bb134
bb96: ; preds = %start
br label %bb134
bb97: ; preds = %start
br label %bb134
bb98: ; preds = %start
br label %bb134
bb99: ; preds = %start
br label %bb134
bb100: ; preds = %start
br label %bb134
bb101: ; preds = %start
br label %bb134
bb102: ; preds = %start
br label %bb134
bb103: ; preds = %start
br label %bb134
bb104: ; preds = %start
br label %bb134
bb105: ; preds = %start
br label %bb134
bb106: ; preds = %start
br label %bb134
bb107: ; preds = %start
br label %bb134
bb108: ; preds = %start
br label %bb134
bb109: ; preds = %start
br label %bb134
bb110: ; preds = %start
br label %bb134
bb111: ; preds = %start
br label %bb134
bb112: ; preds = %start
br label %bb134
bb113: ; preds = %start
br label %bb134
bb114: ; preds = %start
br label %bb134
bb115: ; preds = %start
br label %bb134
bb116: ; preds = %start
br label %bb134
bb117: ; preds = %start
br label %bb134
bb118: ; preds = %start
br label %bb134
bb119: ; preds = %start
br label %bb134
bb120: ; preds = %start
br label %bb134
bb121: ; preds = %start
br label %bb134
bb122: ; preds = %start
br label %bb134
bb123: ; preds = %start
br label %bb134
bb124: ; preds = %start
br label %bb134
bb125: ; preds = %start
br label %bb134
bb126: ; preds = %start
br label %bb134
bb127: ; preds = %start
br label %bb134
bb128: ; preds = %start
br label %bb134
bb129: ; preds = %start
br label %bb134
bb130: ; preds = %start
br label %bb134
bb131: ; preds = %start
br label %bb134
bb132: ; preds = %start
br label %bb134
bb133: ; preds = %start
br label %bb134
bb1: ; preds = %start
br label %bb134
bb134: ; preds = %start, %bb1, %bb133, %bb132, %bb131, %bb130, %bb129, %bb128, %bb127, %bb126, %bb125, %bb124, %bb123, %bb122, %bb121, %bb120, %bb119, %bb118, %bb117, %bb116, %bb115, %bb114, %bb113, %bb112, %bb111, %bb110, %bb109, %bb108, %bb107, %bb106, %bb105, %bb104, %bb103, %bb102, %bb101, %bb100, %bb99, %bb98, %bb97, %bb96, %bb95, %bb94, %bb93, %bb92, %bb91, %bb90, %bb89, %bb88, %bb87, %bb86, %bb85, %bb84, %bb83, %bb82, %bb81, %bb80, %bb79, %bb78, %bb77, %bb76, %bb75, %bb74, %bb73, %bb72, %bb71, %bb70, %bb69, %bb68, %bb67, %bb66, %bb65, %bb64, %bb63, %bb62, %bb61, %bb60, %bb59, %bb58, %bb57, %bb56, %bb55, %bb54, %bb53, %bb52, %bb51, %bb50, %bb49, %bb48, %bb47, %bb46, %bb45, %bb44, %bb43, %bb42, %bb41, %bb40, %bb39, %bb38, %bb37, %bb36, %bb35, %bb34, %bb33, %bb32, %bb31, %bb30, %bb29, %bb28, %bb27, %bb26, %bb25, %bb24, %bb23, %bb22, %bb21, %bb20, %bb19, %bb18, %bb17, %bb16, %bb15, %bb14, %bb13, %bb12, %bb11, %bb10, %bb9, %bb8, %bb7, %bb6, %bb5, %bb4
%_3.sroa.135.0 = phi i64 [ 9, %bb1 ], [ 7, %bb133 ], [ 15, %bb132 ], [ 10, %bb131 ], [ 12, %bb130 ], [ 11, %bb129 ], [ 11, %bb128 ], [ 6, %bb127 ], [ 9, %bb126 ], [ 11, %bb125 ], [ 9, %bb124 ], [ 6, %bb123 ], [ 9, %bb122 ], [ 6, %bb121 ], [ 7, %bb120 ], [ 7, %bb119 ], [ 7, %bb118 ], [ 6, %bb117 ], [ 11, %bb116 ], [ 8, %bb115 ], [ 12, %bb114 ], [ 9, %bb113 ], [ 12, %bb112 ], [ 9, %bb111 ], [ 12, %bb110 ], [ 9, %bb109 ], [ 8, %bb108 ], [ 7, %bb107 ], [ 7, %bb106 ], [ 10, %bb105 ], [ 12, %bb104 ], [ 9, %bb103 ], [ 11, %bb102 ], [ 8, %bb101 ], [ 13, %bb100 ], [ 10, %bb99 ], [ 12, %bb98 ], [ 12, %bb97 ], [ 10, %bb96 ], [ 15, %bb95 ], [ 15, %bb94 ], [ 11, %bb93 ], [ 10, %bb92 ], [ 8, %bb91 ], [ 12, %bb90 ], [ 8, %bb89 ], [ 6, %bb88 ], [ 8, %bb87 ], [ 8, %bb86 ], [ 6, %bb85 ], [ 8, %bb84 ], [ 7, %bb83 ], [ 7, %bb82 ], [ 7, %bb81 ], [ 7, %bb80 ], [ 7, %bb79 ], [ 6, %bb78 ], [ 8, %bb77 ], [ 9, %bb76 ], [ 7, %bb75 ], [ 7, %bb74 ], [ 9, %bb73 ], [ 6, %bb72 ], [ 5, %bb71 ], [ 6, %bb70 ], [ 4, %bb69 ], [ 7, %bb68 ], [ 7, %bb67 ], [ 6, %bb66 ], [ 6, %bb65 ], [ 5, %bb64 ], [ 5, %bb63 ], [ 7, %bb62 ], [ 6, %bb61 ], [ 6, %bb60 ], [ 7, %bb59 ], [ 7, %bb58 ], [ 6, %bb57 ], [ 6, %bb56 ], [ 5, %bb55 ], [ 5, %bb54 ], [ 6, %bb53 ], [ 6, %bb52 ], [ 7, %bb51 ], [ 6, %bb50 ], [ 6, %bb49 ], [ 6, %bb48 ], [ 8, %bb47 ], [ 6, %bb46 ], [ 5, %bb45 ], [ 6, %bb44 ], [ 5, %bb43 ], [ 9, %bb42 ], [ 6, %bb41 ], [ 6, %bb40 ], [ 12, %bb39 ], [ 7, %bb38 ], [ 6, %bb37 ], [ 4, %bb36 ], [ 5, %bb35 ], [ 6, %bb34 ], [ 5, %bb33 ], [ 6, %bb32 ], [ 6, %bb31 ], [ 5, %bb30 ], [ 7, %bb29 ], [ 6, %bb28 ], [ 6, %bb27 ], [ 6, %bb26 ], [ 6, %bb25 ], [ 6, %bb24 ], [ 7, %bb23 ], [ 6, %bb22 ], [ 5, %bb21 ], [ 6, %bb20 ], [ 5, %bb19 ], [ 7, %bb18 ], [ 6, %bb17 ], [ 6, %bb16 ], [ 6, %bb15 ], [ 6, %bb14 ], [ 6, %bb13 ], [ 5, %bb12 ], [ 7, %bb11 ], [ 5, %bb10 ], [ 5, %bb9 ], [ 3, %bb8 ], [ 5, %bb7 ], [ 5, %bb6 ], [ 6, %bb5 ], [ 5, %bb4 ], [ 12, %start ]
%_3.sroa.0.0 = phi ptr [ @alloc_eeeec90dba29775bdab7e5d8b2cb0355, %bb1 ], [ @alloc_b2966257a8ddc16adc71767cf5355c0b, %bb133 ], [ @alloc_38d47c498611f94c9b77481a9521b50b, %bb132 ], [ @alloc_e97612422e606a267463c474940daaaf, %bb131 ], [ @alloc_1685b860d57c20a4bb2090aa8ec3d72f, %bb130 ], [ @alloc_ad94dce71dc3943f9a9c4e3d5270371b, %bb129 ], [ @alloc_f1d202c0b4fc106d9cff99e09505e2ad, %bb128 ], [ @alloc_306701eddbce58119b3b452468e93bce, %bb127 ], [ @alloc_0d44e7c346ed8b0c54abae600d17883f, %bb126 ], [ @alloc_ce81fb960d0bc24749fb6d08ce7d6eaf, %bb125 ], [ @alloc_f92d97beb29ce5b2fada37971b57fbb2, %bb124 ], [ @alloc_a841989f0908480b181ad0c5abcfd68e, %bb123 ], [ @alloc_3d31068ff3e390fedfff0f812b0758d5, %bb122 ], [ @alloc_4a73cf61ecdfb06b8e4a08adceebcfe7, %bb121 ], [ @alloc_3e93dee092649f36ef58758f59c00094, %bb120 ], [ @alloc_2154a05f30b5c4831200572c2d3dab30, %bb119 ], [ @alloc_e4648413a87fcbab95e9f4571686a68d, %bb118 ], [ @alloc_4ab5a989f2022623ea1da48703f7f0bd, %bb117 ], [ @alloc_cf2d0d2856a8dd5bfcf40afd2d7b76e0, %bb116 ], [ @alloc_e2e0883fc1e4f0559ab4d2d7111e2922, %bb115 ], [ @alloc_6b19a2f72bfad61fe889042e59b4f67f, %bb114 ], [ @alloc_7abef68a189e3a7227af6f45c9ababfb, %bb113 ], [ @alloc_44e924003e74a16bc4fbdc8f7c4d0473, %bb112 ], [ @alloc_084da7b8bb6c075ce42a1d77b6c995ee, %bb111 ], [ @alloc_978ec0cb1924f1237f42007a79c519c4, %bb110 ], [ @alloc_4df2654afb1bc82031beadd281a36d0d, %bb109 ], [ @alloc_c5d8dae1133a9087a76df87c2d5ed81a, %bb108 ], [ @alloc_faae74309a203211323bc3327eb25264, %bb107 ], [ @alloc_34dc7edf149271d5a5b67eaf70023d0e, %bb106 ], [ @alloc_69e47bc266bacc5206a88f9fadcf9ec6, %bb105 ], [ @alloc_bb6002a14cc221cb091a29878e9508a5, %bb104 ], [ @alloc_9de36250f4a87fd97880c81cbf713309, %bb103 ], [ @alloc_5a2b78f7503004628f810781f9490c94, %bb102 ], [ @alloc_f2c3b2cac51e42fd971a324253febb13, %bb101 ], [ @alloc_dbca276093c054d8ae582acdce89067e, %bb100 ], [ @alloc_fbca4e93830943a32db7f0544291d7aa, %bb99 ], [ @alloc_3332711b35cc115dd6e0ea31d9faf09d, %bb98 ], [ @alloc_23a2b5b2e50f58b3b2ee5f4e3e9e2963, %bb97 ], [ @alloc_9b01972f1876c57567e9f91eaeac11c0, %bb96 ], [ @alloc_9351c29bf6440ce6cc1d1845b5b2239a, %bb95 ], [ @alloc_47506649da77a5b57506dead306e2262, %bb94 ], [ @alloc_32a5aa9c39e874a9077e926b86087f67, %bb93 ], [ @alloc_800983b72099bfc3abf962370abe5459, %bb92 ], [ @alloc_d1f02fa34d04bd4b912c0c8e2b5b9de6, %bb91 ], [ @alloc_2b516ee3757c032d8fcaaab47bdc82fc, %bb90 ], [ @alloc_86885d2f78b482de79d4322d24e4c411, %bb89 ], [ @alloc_675bba484e0ec186c533a4bd41bdb2c4, %bb88 ], [ @alloc_68ce7b92a59f96b9e4b322d0015566d5, %bb87 ], [ @alloc_5fbe7d2a6eb0974b5d6b9277c8ff292d, %bb86 ], [ @alloc_d8a7f9677534b52f0fedc4e0d3ac4a7f, %bb85 ], [ @alloc_5eee53aa540bac93f85b20a41c4136bb, %bb84 ], [ @alloc_ad2e799ecd66fe4eb367bf0cfe674da4, %bb83 ], [ @alloc_3f394c18d606ce36f2c50816a4c76e96, %bb82 ], [ @alloc_8718d28fb95e407cb1b53420fe73995a, %bb81 ], [ @alloc_8d476f9867546e010d6e0f0e9df2f10e, %bb80 ], [ @alloc_381a6f34b7bf5b9d95c448026655efd5, %bb79 ], [ @alloc_38a3703a08665e1172b160a08c52bf00, %bb78 ], [ @alloc_e6dd583da76751037d2f23e77b767378, %bb77 ], [ @alloc_85bba4fa26b4bc7d3af483aea8d53610, %bb76 ], [ @alloc_7057157759ac58a04dde0cb410735455, %bb75 ], [ @alloc_a2918dd88cad9f1065c1f1fd760d9807, %bb74 ], [ @alloc_be948f685de56bf71d50b73745f4ac60, %bb73 ], [ @alloc_9b9d5c7403c06c1b1893956c83187e72, %bb72 ], [ @alloc_d212a56767d4fb4d6607865d075729f8, %bb71 ], [ @alloc_4d938c510ebb651e82e8de4564215b72, %bb70 ], [ @alloc_28b6884878622fe718b239b613416571, %bb69 ], [ @alloc_9e83da2a1cc21915c62f8367c90fdadb, %bb68 ], [ @alloc_494c0a5ba61fbb7071ff748e4f1cb433, %bb67 ], [ @alloc_d9d5c1a3a4aa94c4d1ff7a160571061c, %bb66 ], [ @alloc_c36568b4b36c804e4870f1aa6bdf3a2a, %bb65 ], [ @alloc_66a462b7da34960c8beaefa60e208b11, %bb64 ], [ @alloc_9b7c24b73a05d66a1cd8ea616dddba58, %bb63 ], [ @alloc_928348b0fb8413d594c672ae38e90e22, %bb62 ], [ @alloc_1ce034ba68a18aae701ac601ad36bf22, %bb61 ], [ @alloc_d84eb78f389905ca0230de88458cb696, %bb60 ], [ @alloc_d9e4fde4db3281ab4c591fb20f834248, %bb59 ], [ @alloc_b4f3881bd3b5b5d43bf383cf86c486ed, %bb58 ], [ @alloc_0421b2104b61159b448eb1aaf9647256, %bb57 ], [ @alloc_723c4a58a17e4aae450d8d9957b22445, %bb56 ], [ @alloc_07b7fccd581de4a0f58043714c6bdb75, %bb55 ], [ @alloc_bbd696d7e836174617963e3a3b02c4bf, %bb54 ], [ @alloc_89a077ecdcb316fd3d18ea1802da26b1, %bb53 ], [ @alloc_2bf2316dde628223adb61e3b01869c64, %bb52 ], [ @alloc_f334c77768804055ec99d59fda099fb7, %bb51 ], [ @alloc_1cb2662dfdef045b8930644c453bf476, %bb50 ], [ @alloc_836b57fdf72146d7a3653eecc17a7200, %bb49 ], [ @alloc_6f36aa02338841494924dfd8849543f3, %bb48 ], [ @alloc_09d0693eba27d653ddd27e966fb83a8e, %bb47 ], [ @alloc_2939475bfabcad8c50c892fbf318f7dd, %bb46 ], [ @alloc_215d33806f4ba809a2b96795d1e7a0e6, %bb45 ], [ @alloc_0526207bb0c9401b11586abdea37a0ec, %bb44 ], [ @alloc_a82e52c8c91e88d90ecebbbba2dd9f9e, %bb43 ], [ @alloc_2603dd6381b9af60034e46608f8f66fc, %bb42 ], [ @alloc_01c4584c71d29ab89453b0c1dfa9f5c8, %bb41 ], [ @alloc_721e060f8ee21ebd020f01daad5f2975, %bb40 ], [ @alloc_de098db79b872822198968bbc383469f, %bb39 ], [ @alloc_dcb34ae2af2ce66e0e5dcfa999e3beb7, %bb38 ], [ @alloc_eb59d2b23a3d7b405fe7b10c3a0c3e5a, %bb37 ], [ @alloc_da0b686a5e1dc859499cae16431f96ae, %bb36 ], [ @alloc_2881bd0c21bd06bd22ebf60a0f3a2028, %bb35 ], [ @alloc_0c664ef1627eefa7120e5cb745bcf752, %bb34 ], [ @alloc_8563ec224e7b49c3c4502731d867c128, %bb33 ], [ @alloc_5b80a9cc4738a62be9f7d95c8d597dc7, %bb32 ], [ @alloc_28d4f003a3a8ed43710568c95fe9351a, %bb31 ], [ @alloc_3705aa602755f3be9a0919f381aa127f, %bb30 ], [ @alloc_351946230f087e85e556fe3b968b1981, %bb29 ], [ @alloc_c3301bc6520ccc9163bce47dddbff6b8, %bb28 ], [ @alloc_b00570ec474102351a8977332fa64d30, %bb27 ], [ @alloc_3b6bceff34f14ce8e4c2f343be15df26, %bb26 ], [ @alloc_31bae0bbf06c82dc196d425d3504b50d, %bb25 ], [ @alloc_8a55676c016656c683fd58df6cbbfcc8, %bb24 ], [ @alloc_e8207917a07ca92b599995c6bf68fdda, %bb23 ], [ @alloc_f1e9fdc6bc423e1edfbbcdf54c955cc1, %bb22 ], [ @alloc_bc821d93424984e9dcc8d410acb3401b, %bb21 ], [ @alloc_2dfe18e858cf93870a4cff1370e9c9b0, %bb20 ], [ @alloc_ff8994d9eba3e5343a9b53228010da31, %bb19 ], [ @alloc_f54eb14543977fe5fc802f49b30ccdca, %bb18 ], [ @alloc_8a8d12330b0edcc0ff37327ed998255f, %bb17 ], [ @alloc_3b2624a9f6c83698379a8f772e74bb38, %bb16 ], [ @alloc_f7b6042e65e87cd23a945053af86f2ef, %bb15 ], [ @alloc_82a96ddff67c3ec277e473895a80dd1e, %bb14 ], [ @alloc_98538349a2cd2820ed22bd9f0b9dc802, %bb13 ], [ @alloc_00ea1e26a59b8dc57996c8f8bd4a3717, %bb12 ], [ @alloc_bd057cb34460f661ef182ff156fc819e, %bb11 ], [ @alloc_42a580698ba93a37df51119b31cd88c1, %bb10 ], [ @alloc_6dedd2160d6d8f97ec4f1623b4302f7c, %bb9 ], [ @alloc_1ad3c9658acad47760e4c473a34c7d3b, %bb8 ], [ @alloc_ad0a99e246003c87ceb7d0f323ff2580, %bb7 ], [ @alloc_efa918ca8fd350104162f4b89715815c, %bb6 ], [ @alloc_56041ca6eaaf7e3ef282582e48dffd90, %bb5 ], [ @alloc_c0277d8038a6c64e72887cbcc884c3bb, %bb4 ], [ @alloc_94de12363f3ad82eb88f17c146010918, %start ]
; call core::fmt::Formatter::write_str
%_0 = tail call noundef zeroext i1 @_ZN4core3fmt9Formatter9write_str17h8dee415c7bc221bcE(ptr noalias noundef nonnull align 8 dereferenceable(64) %f, ptr noalias noundef nonnull readonly align 1 %_3.sroa.0.0, i64 noundef %_3.sroa.135.0) #1
ret i1 %_0
}
Of note, the first case in the switch branches directly to bb134 while all others branch to their own basic block which immediately branches to bb134. I'm guessing some analysis in LLVM gives up on large switch terminators as removing 4 variants (so that there are exactly 128 cases) results in much more optimal IR:
; <example::Errno as core::fmt::Debug>::fmt
; Function Attrs: nounwind nonlazybind
define noundef zeroext i1 @"_ZN51_$LT$example..Errno$u20$as$u20$core..fmt..Debug$GT$3fmt17h0aaa260da578c4baE"(ptr noalias nocapture noundef readonly align 1 dereferenceable(1) %self, ptr noalias noundef align 8 dereferenceable(64) %f) unnamed_addr #0 {
start:
%0 = load i8, ptr %self, align 1, !range !3, !noundef !4
%_4 = zext i8 %0 to i64
%switch.gep = getelementptr inbounds [128 x i64], ptr @"switch.table._ZN51_$LT$example..Errno$u20$as$u20$core..fmt..Debug$GT$3fmt17h0aaa260da578c4baE", i64 0, i64 %_4
%switch.load = load i64, ptr %switch.gep, align 8
%reltable.shift = shl i64 %_4, 2
%reltable.intrinsic = call ptr @llvm.load.relative.i64(ptr @"reltable._ZN51_$LT$example..Errno$u20$as$u20$core..fmt..Debug$GT$3fmt17h0aaa260da578c4baE", i64 %reltable.shift)
; call core::fmt::Formatter::write_str
%_0 = tail call noundef zeroext i1 @_ZN4core3fmt9Formatter9write_str17h8dee415c7bc221bcE(ptr noalias noundef nonnull align 8 dereferenceable(64) %f, ptr noalias noundef nonnull readonly align 1 %reltable.intrinsic, i64 noundef %switch.load) #2
ret i1 %_0
}
The impact on codesize is significant with the 132-variant version of <Errno as Debug>::fmt weighing in at 2,650 bytes and the 128-variant version occupying only 40 bytes.
Metadata
Metadata
Assignees
Labels
A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.C-bugCategory: This is a bug.Category: This is a bug.C-optimizationCategory: An issue highlighting optimization opportunities or PRs implementing suchCategory: An issue highlighting optimization opportunities or PRs implementing suchI-heavyIssue: Problems and improvements with respect to binary size of generated code.Issue: Problems and improvements with respect to binary size of generated code.