aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2010-09-30 21:24:10 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2010-09-30 21:24:10 +0200
commitbb6b5461d12495403054e2a8fc7a73d753ebd90c (patch)
treec2b9860f187de8eb731604c9b74b451d3893dcfe /gcc
parent140d4effd556b7da4a322f8d34c2dde6758d09e7 (diff)
downloadgcc-bb6b5461d12495403054e2a8fc7a73d753ebd90c.zip
gcc-bb6b5461d12495403054e2a8fc7a73d753ebd90c.tar.gz
gcc-bb6b5461d12495403054e2a8fc7a73d753ebd90c.tar.bz2
* dwarf2out.c (mem_loc_descriptor): Handle IF_THEN_ELSE.
From-SVN: r164762
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog2
-rw-r--r--gcc/dwarf2out.c26
2 files changed, 27 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ae7d85d..9f3bccc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,7 @@
2010-09-30 Jakub Jelinek <jakub@redhat.com>
+ * dwarf2out.c (mem_loc_descriptor): Handle IF_THEN_ELSE.
+
PR tree-optimization/31261
* fold-const.c (fold_binary): Optimize ((A & N) + B) & M
for constants M and N, M == (1LL << cst) - 1 && (N & M) == M.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 735a0c2..9136eaa 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -14162,8 +14162,32 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
}
break;
- case COMPARE:
case IF_THEN_ELSE:
+ {
+ dw_loc_descr_ref op2, bra_node, drop_node;
+ op0 = mem_loc_descriptor (XEXP (rtl, 0), mode,
+ VAR_INIT_STATUS_INITIALIZED);
+ op1 = mem_loc_descriptor (XEXP (rtl, 1), mode,
+ VAR_INIT_STATUS_INITIALIZED);
+ op2 = mem_loc_descriptor (XEXP (rtl, 2), mode,
+ VAR_INIT_STATUS_INITIALIZED);
+ if (op0 == NULL || op1 == NULL || op2 == NULL)
+ break;
+
+ mem_loc_result = op1;
+ add_loc_descr (&mem_loc_result, op2);
+ add_loc_descr (&mem_loc_result, op0);
+ bra_node = new_loc_descr (DW_OP_bra, 0, 0);
+ add_loc_descr (&mem_loc_result, bra_node);
+ add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_swap, 0, 0));
+ drop_node = new_loc_descr (DW_OP_drop, 0, 0);
+ add_loc_descr (&mem_loc_result, drop_node);
+ bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
+ bra_node->dw_loc_oprnd1.v.val_loc = drop_node;
+ }
+ break;
+
+ case COMPARE:
case ROTATE:
case ROTATERT:
case TRUNCATE: