diff options
author | Michael Forney <mforney@mforney.org> | 2021-09-28 12:13:33 -0700 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2021-09-28 12:17:29 -0700 |
commit | 7e8386697aa60c1813019eda3cd2073e6be5b021 (patch) | |
tree | 14659072efa826982a43253af8cc3eb9b4c85381 /test | |
parent | ab3946c6801be3520beeb79f5500ed1a944d4667 (diff) |
Skip unnecessary conversion to bool for logical and conditional expressions
As in ede6a5c9, if an expression is used only to control a jnz, we
don't need to convert it to a 0 or 1 value. QBE ignores the upper
32-bits of the argument to jnz, so the conversion is still needed
for pointer, long, and floating point types (including float since
-0 has non-zero bit representation).
Diffstat (limited to 'test')
-rw-r--r-- | test/conditional-compound-literal.qbe | 19 | ||||
-rw-r--r-- | test/conditional.c | 11 | ||||
-rw-r--r-- | test/conditional.qbe | 44 | ||||
-rw-r--r-- | test/logical-and.c | 11 | ||||
-rw-r--r-- | test/logical-and.qbe | 38 | ||||
-rw-r--r-- | test/logical-or.c | 11 | ||||
-rw-r--r-- | test/logical-or.qbe | 38 |
7 files changed, 162 insertions, 10 deletions
diff --git a/test/conditional-compound-literal.qbe b/test/conditional-compound-literal.qbe index 57358e6..739eea4 100644 --- a/test/conditional-compound-literal.qbe +++ b/test/conditional-compound-literal.qbe @@ -3,20 +3,19 @@ function w $main() { @start.1 %.1 =l alloc4 4 %.2 =l alloc8 8 - %.4 =l alloc4 4 + %.3 =l alloc4 4 @body.2 storew 0, %.1 - %.3 =w cnew 0, 0 - jnz %.3, @cond_true.3, @cond_false.4 + jnz 0, @cond_true.3, @cond_false.4 @cond_true.3 jmp @cond_join.5 @cond_false.4 - %.5 =w loadw %.1 - storew %.5, %.4 + %.4 =w loadw %.1 + storew %.4, %.3 @cond_join.5 - %.6 =l phi @cond_true.3 0, @cond_false.4 %.4 - storel %.6, %.2 - %.7 =l loadl %.2 - %.8 =w loadw %.7 - ret %.8 + %.5 =l phi @cond_true.3 0, @cond_false.4 %.3 + storel %.5, %.2 + %.6 =l loadl %.2 + %.7 =w loadw %.6 + ret %.7 } diff --git a/test/conditional.c b/test/conditional.c new file mode 100644 index 0000000..1c03ee5 --- /dev/null +++ b/test/conditional.c @@ -0,0 +1,11 @@ +int i; +float f; +void *p; +int main(void) { + if (i ? 1 : 0) + return 1; + if (f ? 1 : 0) + return 1; + if (p ? 1 : 0) + return 1; +} diff --git a/test/conditional.qbe b/test/conditional.qbe new file mode 100644 index 0000000..f4d6f28 --- /dev/null +++ b/test/conditional.qbe @@ -0,0 +1,44 @@ +export +function w $main() { +@start.1 +@body.2 + %.1 =w loadw $i + jnz %.1, @cond_true.3, @cond_false.4 +@cond_true.3 + jmp @cond_join.5 +@cond_false.4 +@cond_join.5 + %.2 =w phi @cond_true.3 1, @cond_false.4 0 + jnz %.2, @if_true.6, @if_false.7 +@if_true.6 + ret 1 +@if_false.7 + %.3 =s loads $f + %.4 =w cnes %.3, s_0 + jnz %.4, @cond_true.8, @cond_false.9 +@cond_true.8 + jmp @cond_join.10 +@cond_false.9 +@cond_join.10 + %.5 =w phi @cond_true.8 1, @cond_false.9 0 + jnz %.5, @if_true.11, @if_false.12 +@if_true.11 + ret 1 +@if_false.12 + %.6 =l loadl $p + %.7 =w cnel %.6, 0 + jnz %.7, @cond_true.13, @cond_false.14 +@cond_true.13 + jmp @cond_join.15 +@cond_false.14 +@cond_join.15 + %.8 =w phi @cond_true.13 1, @cond_false.14 0 + jnz %.8, @if_true.16, @if_false.17 +@if_true.16 + ret 1 +@if_false.17 + ret 0 +} +export data $i = align 4 { z 4 } +export data $f = align 4 { z 4 } +export data $p = align 8 { z 8 } diff --git a/test/logical-and.c b/test/logical-and.c new file mode 100644 index 0000000..34b4867 --- /dev/null +++ b/test/logical-and.c @@ -0,0 +1,11 @@ +int i; +float f; +void *p; +int main(void) { + if (i && 1) + return 1; + if (f && 1) + return 1; + if (p && 1) + return 1; +} diff --git a/test/logical-and.qbe b/test/logical-and.qbe new file mode 100644 index 0000000..21fd79a --- /dev/null +++ b/test/logical-and.qbe @@ -0,0 +1,38 @@ +export +function w $main() { +@start.1 +@body.2 + %.1 =w loadw $i + jnz %.1, @logic_right.3, @logic_join.4 +@logic_right.3 +@logic_join.4 + %.2 =w phi @body.2 0, @logic_right.3 1 + jnz %.2, @if_true.5, @if_false.6 +@if_true.5 + ret 1 +@if_false.6 + %.3 =s loads $f + %.4 =w cnes %.3, s_0 + jnz %.4, @logic_right.7, @logic_join.8 +@logic_right.7 +@logic_join.8 + %.5 =w phi @if_false.6 0, @logic_right.7 1 + jnz %.5, @if_true.9, @if_false.10 +@if_true.9 + ret 1 +@if_false.10 + %.6 =l loadl $p + %.7 =w cnel %.6, 0 + jnz %.7, @logic_right.11, @logic_join.12 +@logic_right.11 +@logic_join.12 + %.8 =w phi @if_false.10 0, @logic_right.11 1 + jnz %.8, @if_true.13, @if_false.14 +@if_true.13 + ret 1 +@if_false.14 + ret 0 +} +export data $i = align 4 { z 4 } +export data $f = align 4 { z 4 } +export data $p = align 8 { z 8 } diff --git a/test/logical-or.c b/test/logical-or.c new file mode 100644 index 0000000..2a0485c --- /dev/null +++ b/test/logical-or.c @@ -0,0 +1,11 @@ +int i; +float f; +void *p; +int main(void) { + if (i || 0) + return 1; + if (f || 0) + return 1; + if (p || 0) + return 1; +} diff --git a/test/logical-or.qbe b/test/logical-or.qbe new file mode 100644 index 0000000..e1025c9 --- /dev/null +++ b/test/logical-or.qbe @@ -0,0 +1,38 @@ +export +function w $main() { +@start.1 +@body.2 + %.1 =w loadw $i + jnz %.1, @logic_join.4, @logic_right.3 +@logic_right.3 +@logic_join.4 + %.2 =w phi @body.2 1, @logic_right.3 0 + jnz %.2, @if_true.5, @if_false.6 +@if_true.5 + ret 1 +@if_false.6 + %.3 =s loads $f + %.4 =w cnes %.3, s_0 + jnz %.4, @logic_join.8, @logic_right.7 +@logic_right.7 +@logic_join.8 + %.5 =w phi @if_false.6 1, @logic_right.7 0 + jnz %.5, @if_true.9, @if_false.10 +@if_true.9 + ret 1 +@if_false.10 + %.6 =l loadl $p + %.7 =w cnel %.6, 0 + jnz %.7, @logic_join.12, @logic_right.11 +@logic_right.11 +@logic_join.12 + %.8 =w phi @if_false.10 1, @logic_right.11 0 + jnz %.8, @if_true.13, @if_false.14 +@if_true.13 + ret 1 +@if_false.14 + ret 0 +} +export data $i = align 4 { z 4 } +export data $f = align 4 { z 4 } +export data $p = align 8 { z 8 } |