Hi Mark, sorry I forgot to cc qemu-devel :/
On 03/12/2015 08:41 AM, Mark Cave-Ayland wrote:
Hi all,
Whilst testing git master in preparation for some OpenBIOS updates, I'm
seeing the following TCG assert in one of my older test images:
$ gdb --args ./qemu-system-ppc -cdrom
/home/build/src/qemu/image/ppc/ubuntu-5.10-live-powerpc.iso -boot d -g
800x600x8
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show
copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/build/rel-qemu-git/bin/qemu-system-ppc...done.
(gdb) r
Starting program: /home/build/rel-qemu-git/bin/qemu-system-ppc -cdrom
/home/build/src/qemu/image/ppc/ubuntu-5.10-live-powerpc.iso -boot d -g
800x600x8
[Thread debugging using libthread_db enabled]
Using host libthread_db library
"/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffe9ef3700 (LWP 11437)]
[New Thread 0x7fffe5bf1700 (LWP 11438)]
[New Thread 0x7fffe53f0700 (LWP 11439)]
[Thread 0x7fffe5bf1700 (LWP 11438) exited]
[New Thread 0x7fffe5bf1700 (LWP 11443)]
[Thread 0x7fffe5bf1700 (LWP 11443) exited]
qemu-system-ppc: /home/build/src/qemu/git/qemu/tcg/optimize.c:212:
tcg_opt_gen_mov: Assertion `temps[src].state != TCG_TEMP_CONST' failed.
does this fix it?
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 96adf9a..4c8ff70 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -396,7 +396,11 @@ static inline void tcg_gen_and_i32(TCGv_i32 ret,
TCGv_i32 arg1, TCGv_i32 arg2)
static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1,
TCGv_i32 arg2)
{
- tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
+ if (TCGV_EQUAL_I32(arg1, arg2)) {
+ tcg_gen_mov_i32(ret, arg1);
+ } else {
+ tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
+ }
}
static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1,
TCGv_i32 arg2)
The patch is also attached. It is just a revert of tcg_gen_or_i32. I'll
investigate some more why the optimizer fails here.
Cheers,
Bastian
>From 64c6c9e8a312ae6030794ae1c0fb8e45ce0d77a3 Mon Sep 17 00:00:00 2001
From: Bastian Koppelmann <kbast...@mail.uni-paderborn.de>
Date: Thu, 12 Mar 2015 14:47:29 +0000
Subject: [PATCH] tcg: tcg_gen_or_i32 causing in some cases tcg_opt_gen_mov to
fail
A first try to fix this is to emit the mov in tcg_or_i32.
Signed-off-by: Bastian Koppelmann <kbast...@mail.uni-paderborn.de>
---
tcg/tcg-op.h | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 96adf9a..4c8ff70 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -396,7 +396,11 @@ static inline void tcg_gen_and_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
static inline void tcg_gen_or_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
{
- tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
+ if (TCGV_EQUAL_I32(arg1, arg2)) {
+ tcg_gen_mov_i32(ret, arg1);
+ } else {
+ tcg_gen_op3_i32(INDEX_op_or_i32, ret, arg1, arg2);
+ }
}
static inline void tcg_gen_xor_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
--
2.3.2