aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2015-05-16 09:28:16 +0200
committerUros Bizjak <uros@gcc.gnu.org>2015-05-16 09:28:16 +0200
commit30a5d3e6185a5fa01aec283ae9efe8b739dffdf9 (patch)
tree765de0283dc457aa33c8508aaa8271d8fae71fc3
parent5ea73ae3b8b3df5d0b015df5536c9fe4875c8a4f (diff)
downloadgcc-30a5d3e6185a5fa01aec283ae9efe8b739dffdf9.zip
gcc-30a5d3e6185a5fa01aec283ae9efe8b739dffdf9.tar.gz
gcc-30a5d3e6185a5fa01aec283ae9efe8b739dffdf9.tar.bz2
re PR target/66140 (ICE at extract_insn, at recog.c:2343 when compiling for alpha with gcc-5.1.1)
PR target/66140 * config/alpha/alpha.c (get_aligned_mem): Also look for reload replacements in memory addresses. (get_unaligned_address): Ditto. testsuite/ChangeLog: PR target/66140 * gcc.target/alpha/pr66140.c: New test. From-SVN: r223232
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/alpha/alpha.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/alpha/pr66140.c53
4 files changed, 67 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3dec6b1..da14ae8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-05-16 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/66140
+ * config/alpha/alpha.c (get_aligned_mem): Also look for reload
+ replacements in memory addresses.
+ (get_unaligned_address): Ditto.
+
2015-05-15 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/64454
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index c52834d..6865321 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -1556,8 +1556,7 @@ get_aligned_mem (rtx ref, rtx *paligned_mem, rtx *pbitnum)
gcc_assert (MEM_P (ref));
- if (reload_in_progress
- && ! memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
+ if (reload_in_progress)
{
base = find_replacement (&XEXP (ref, 0));
gcc_assert (memory_address_p (GET_MODE (ref), base));
@@ -1602,11 +1601,9 @@ get_unaligned_address (rtx ref)
gcc_assert (MEM_P (ref));
- if (reload_in_progress
- && ! memory_address_p (GET_MODE (ref), XEXP (ref, 0)))
+ if (reload_in_progress)
{
base = find_replacement (&XEXP (ref, 0));
-
gcc_assert (memory_address_p (GET_MODE (ref), base));
}
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cdd1c28..123dadf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-16 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/66140
+ * gcc.target/alpha/pr66140.c: New test.
+
2015-05-15 Mikhail Maltsev <maltsevm@gmail.com>
PR c/48956
diff --git a/gcc/testsuite/gcc.target/alpha/pr66140.c b/gcc/testsuite/gcc.target/alpha/pr66140.c
new file mode 100644
index 0000000..d559f69
--- /dev/null
+++ b/gcc/testsuite/gcc.target/alpha/pr66140.c
@@ -0,0 +1,53 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=ev4" } */
+
+struct scsi_cmnd {
+ int sc_data_direction;
+};
+struct lpfc_hba {
+ unsigned cfg_total_seg_cnt;
+};
+struct lpfc_scsi_buf {
+ struct scsi_cmnd *pCmd;
+ unsigned seg_cnt;
+ unsigned *fcp_bpl;
+};
+
+extern void *sg_next(void *sg);
+extern void *scsi_sglist(struct scsi_cmnd *cmd);
+extern unsigned scsi_sg_count(struct scsi_cmnd *cmd);
+
+static inline void dma_map_sg_attrs(void *sg, int nents, int dir)
+{
+ int i;
+
+ for (i = 0; i < nents; i++, sg = sg_next(sg))
+ ;
+
+ if (!dir)
+ asm volatile( "call_pal %0" : : "i"(129));
+}
+
+static inline void lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
+ unsigned *pde5)
+{
+ void *sgde;
+ int i;
+
+ *pde5 = (((0x85 & 0x000000ff) << 24) | (*pde5 & ~(0x000000ff << 24)));
+ for (i = 0, sgde = scsi_sglist(sc); i < 2; i++, sgde = sg_next(sgde))
+ ;
+}
+
+void lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
+ struct lpfc_scsi_buf *lpfc_cmd)
+{
+ struct scsi_cmnd *scsi_cmnd = lpfc_cmd->pCmd;
+ unsigned *bpl = lpfc_cmd->fcp_bpl;
+
+ dma_map_sg_attrs(scsi_sglist(scsi_cmnd),
+ scsi_sg_count(scsi_cmnd),
+ scsi_cmnd->sc_data_direction);
+ if (lpfc_cmd->seg_cnt > phba->cfg_total_seg_cnt)
+ lpfc_bg_setup_bpl(phba, scsi_cmnd, bpl);
+}