<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/157113>157113</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SimplifyCFG] Fold switch to wrapping range check
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nikic
</td>
</tr>
</table>
<pre>
https://alive2.llvm.org/ce/z/mr3yq_
```llvm
define i32 @src(i8 range(i8 0, 6) %arg) {
switch i8 %arg, label %else [
i8 0, label %if
i8 4, label %if
i8 5, label %if
]
if:
ret i32 0
else:
ret i32 1
}
define i32 @tgt(i8 %arg) {
%add = add i8 %arg, -1
%cmp2 = icmp ult i8 %add, 3
br i1 %cmp2, label %else, label %if
if:
ret i32 0
else:
ret i32 1
}
```
The known range here allows us to express the switch condition as a wrapping range check.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykk09zmzwQxj_NctmxR0jImAMHJx7eD_D23pGRDNsIRCURN_n0HUFImj89dcYzMnoerfa3q1UhUDcaU4O8A3nO1Bx75-uRHqjNLk4_1X2MUwBxAt4Ab5SlR8P31j4Oe-c74E1rgDfPwJvBi6ef34Gd4MDWX3IBO2lzpdEgCY5QsOBb4Ec6oldjZ9a_DPg9HoBXCFyqFLZCKO-AnRDDjWLbIx1ftXu06mJs-jY2GEypJyfiFupVp-ubUvxVkV8pIM-JhZ3omujTljdxoWCrkC7_KOVJKl9OvgePXVxpPzOmHa0RxBnT-o51l2-Wdpj44qF2mHC2cTNqnYxi8V08Ur65P9XqM-g_AG5tXs3feoMPo7uNa2OxN96gstbdAs4Bo0Pza_ImBIy92braulFTJDeiCqjw5tU00di9hGh70z7sM10LXYlKZabOS1myY34UMuvrSh6qomAFEyVrL8ciN8W1OqpSXLXWlRAZ1ZxxySom8yIvc7mXVV4weSi54FVVGAUFM4Mi-_qeMwphNnUuyzwX2VKpsIwG58tjFic3RRroWaWkA_BUYuB8oBCM3v0pJk2eM1-ng7vL3AUomKUQw9ttkaJdRu9_GiZL16f75j-QZ2yc1VuJovuyLNns7YfZ7Cj282XfugF4s6S7LrvJux-mjcCbBS8Ab14IH2v-OwAA__81jCsv">