[Wasm] Optimize when using br_table only if all conditions read and compare the same variable
#KT-60212 Fixed
This commit is contained in:
committed by
Space Team
parent
39ef189e05
commit
5d1379ead1
+11
@@ -44,6 +44,17 @@ internal fun BodyGenerator.tryGenerateOptimisedWhen(expression: IrWhen, symbols:
|
|||||||
if (extractedBranches.isEmpty()) return false
|
if (extractedBranches.isEmpty()) return false
|
||||||
val subject = extractedBranches[0].conditions[0].condition.getValueArgument(0) ?: return false
|
val subject = extractedBranches[0].conditions[0].condition.getValueArgument(0) ?: return false
|
||||||
|
|
||||||
|
// Do the optimization only if all conditions read and compare the same var or val
|
||||||
|
// TODO: consider supporting other cases
|
||||||
|
if (subject !is IrGetValue) return false
|
||||||
|
val subjectValue = subject.symbol
|
||||||
|
val allConditionsReadsSameValue = !extractedBranches.all { branch ->
|
||||||
|
branch.conditions.all { whenCondition ->
|
||||||
|
(whenCondition.condition.getValueArgument(0) as? IrGetValue)?.symbol == subjectValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (allConditionsReadsSameValue) return false
|
||||||
|
|
||||||
// Check all kinds are the same
|
// Check all kinds are the same
|
||||||
for (branch in extractedBranches) {
|
for (branch in extractedBranches) {
|
||||||
//TODO: Support all primitive types
|
//TODO: Support all primitive types
|
||||||
|
|||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
fun box(): String {
|
||||||
|
testIfs()
|
||||||
|
testWhen()
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// From KT-60212
|
||||||
|
fun testIfs() {
|
||||||
|
val b1 = 0b11011111
|
||||||
|
if (b1 and 0b10000000 == 0) {
|
||||||
|
fail("A")
|
||||||
|
} else if (b1 and 0b11100000 == 0b11000000) {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
fail("C")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Snippet from kotlinx-io
|
||||||
|
fun testWhen() {
|
||||||
|
val v = test(0xdf)
|
||||||
|
if (v != 1) fail("D")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test(b0: Int) = when {
|
||||||
|
b0 and 0x80 == 0 -> 0
|
||||||
|
b0 and 0xe0 == 0xc0 -> 1
|
||||||
|
b0 and 0xf0 == 0xe0 -> 2
|
||||||
|
b0 and 0xf8 == 0xf0 -> 3
|
||||||
|
else -> -1
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user