backport: [multiple changes]

2010-09-07  Ian Bolton  <ian.bolton@arm.com>

	Backport from mainline
	2010-09-01  Ian Bolton  <ian.bolton@arm.com>

	* Makefile.in (tree-switch-conversion.o): Update dependencies.
	
	2010-08-19  Ian Bolton  <ian.bolton@arm.com>
	
	PR target/45070
	* config/arm/arm.c (arm_output_epilogue): Ensure that return
	value of size 1-3 is handled correctly.

	* gcc.c-torture/execute/pr45070.c: New.

	2010-08-19  Ian Bolton  <ian.bolton@arm.com>

	* tree-switch-conversion.c (gen_inbound_check): Ensure that the
	type for the conditional has wide enough range.

	* g++.dg/pr44328.C: New test.

	2010-08-07  Marcus Shawcroft  <marcus.shawcroft@arm.com>
	
	* config/arm/linux-atomic.c (SUBWORD_VAL_CAS): Instantiate with
	'unsigned short' and 'unsigned char' instead of 'short' and 'char'.
	(SUBWORD_BOOL_CAS): Likewise.
	(SUBWORD_SYNC_OP): Likewise.
	(SUBWORD_TEST_AND_SET): Likewise.
	(FETCH_AND_OP_WORD): Parenthesise INF_OP
	(SUBWORD_SYNC_OP): Likewise.
	(OP_AND_FETCH_WORD): Likewise.

	* lib/target-supports.exp: (check_effective_target_sync_int_long):
	Add arm*-*-linux-gnueabi.
	(check_effective_target_sync_char_short): Likewise.

From-SVN: r163945
This commit is contained in:
Ian Bolton 2010-09-07 11:07:31 +00:00 committed by Ian Bolton
parent 8bf4a81ae4
commit 627bbb1a53
9 changed files with 184 additions and 40 deletions

View File

@ -1,5 +1,34 @@
2010-09-02 Jakub Jelinek <jakub@redhat.com>
2010-09-07 Ian Bolton <ian.bolton@arm.com>
Backport from mainline
2010-09-01 Ian Bolton <ian.bolton@arm.com>
* Makefile.in (tree-switch-conversion.o): Update dependencies.
2010-08-19 Ian Bolton <ian.bolton@arm.com>
PR target/45070
* config/arm/arm.c (arm_output_epilogue): Ensure that return
value of size 1-3 is handled correctly.
2010-08-19 Ian Bolton <ian.bolton@arm.com>
* tree-switch-conversion.c (gen_inbound_check): Ensure that the
type for the conditional has wide enough range.
2010-08-07 Marcus Shawcroft <marcus.shawcroft@arm.com>
* config/arm/linux-atomic.c (SUBWORD_VAL_CAS): Instantiate with
'unsigned short' and 'unsigned char' instead of 'short' and 'char'.
(SUBWORD_BOOL_CAS): Likewise.
(SUBWORD_SYNC_OP): Likewise.
(SUBWORD_TEST_AND_SET): Likewise.
(FETCH_AND_OP_WORD): Parenthesise INF_OP
(SUBWORD_SYNC_OP): Likewise.
(OP_AND_FETCH_WORD): Likewise.
2010-09-02 Jakub Jelinek <jakub@redhat.com>
Backport from mainline
2010-08-30 Jakub Jelinek <jakub@redhat.com>

View File

@ -2718,7 +2718,7 @@ tree-switch-conversion.o : tree-switch-conversion.c $(CONFIG_H) $(SYSTEM_H) \
$(TREE_H) $(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_H) $(TREE_INLINE_H) \
$(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) $(GIMPLE_H) \
tree-pass.h $(FLAGS_H) $(EXPR_H) $(BASIC_BLOCK_H) output.h \
$(GGC_H) $(OBSTACK_H) $(PARAMS_H) $(CPPLIB_H) $(PARAMS_H)
$(GGC_H) $(OBSTACK_H) $(PARAMS_H) $(CPPLIB_H) $(PARAMS_H) langhooks.h
tree-complex.o : tree-complex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
$(TM_H) $(RTL_H) $(REAL_H) $(FLAGS_H) $(TREE_FLOW_H) $(GIMPLE_H) \
tree-iterator.h tree-pass.h tree-ssa-propagate.h $(DIAGNOSTIC_H)

View File

@ -12150,7 +12150,8 @@ arm_output_epilogue (rtx sibling)
&& !crtl->tail_call_emit)
{
unsigned long mask;
mask = (1 << (arm_size_return_regs() / 4)) - 1;
/* Preserve return values, of any size. */
mask = (1 << ((arm_size_return_regs() + 3) / 4)) - 1;
mask ^= 0xf;
mask &= ~saved_regs_mask;
reg = 0;

View File

@ -56,7 +56,7 @@ typedef void (__kernel_dmb_t) (void);
\
do { \
tmp = *ptr; \
failure = __kernel_cmpxchg (tmp, PFX_OP tmp INF_OP val, ptr); \
failure = __kernel_cmpxchg (tmp, PFX_OP (tmp INF_OP val), ptr); \
} while (failure != 0); \
\
return tmp; \
@ -88,8 +88,8 @@ FETCH_AND_OP_WORD (nand, ~, &)
\
do { \
oldval = *wordptr; \
newval = ((PFX_OP ((oldval & mask) >> shift) \
INF_OP (unsigned int) val) << shift) & mask; \
newval = ((PFX_OP (((oldval & mask) >> shift) \
INF_OP (unsigned int) val)) << shift) & mask; \
newval |= oldval & ~mask; \
failure = __kernel_cmpxchg (oldval, newval, wordptr); \
} while (failure != 0); \
@ -97,19 +97,19 @@ FETCH_AND_OP_WORD (nand, ~, &)
return (RETURN & mask) >> shift; \
}
SUBWORD_SYNC_OP (add, , +, short, 2, oldval)
SUBWORD_SYNC_OP (sub, , -, short, 2, oldval)
SUBWORD_SYNC_OP (or, , |, short, 2, oldval)
SUBWORD_SYNC_OP (and, , &, short, 2, oldval)
SUBWORD_SYNC_OP (xor, , ^, short, 2, oldval)
SUBWORD_SYNC_OP (nand, ~, &, short, 2, oldval)
SUBWORD_SYNC_OP (add, , +, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (sub, , -, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (or, , |, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (and, , &, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (xor, , ^, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (nand, ~, &, unsigned short, 2, oldval)
SUBWORD_SYNC_OP (add, , +, char, 1, oldval)
SUBWORD_SYNC_OP (sub, , -, char, 1, oldval)
SUBWORD_SYNC_OP (or, , |, char, 1, oldval)
SUBWORD_SYNC_OP (and, , &, char, 1, oldval)
SUBWORD_SYNC_OP (xor, , ^, char, 1, oldval)
SUBWORD_SYNC_OP (nand, ~, &, char, 1, oldval)
SUBWORD_SYNC_OP (add, , +, unsigned char, 1, oldval)
SUBWORD_SYNC_OP (sub, , -, unsigned char, 1, oldval)
SUBWORD_SYNC_OP (or, , |, unsigned char, 1, oldval)
SUBWORD_SYNC_OP (and, , &, unsigned char, 1, oldval)
SUBWORD_SYNC_OP (xor, , ^, unsigned char, 1, oldval)
SUBWORD_SYNC_OP (nand, ~, &, unsigned char, 1, oldval)
#define OP_AND_FETCH_WORD(OP, PFX_OP, INF_OP) \
int HIDDEN \
@ -119,10 +119,10 @@ SUBWORD_SYNC_OP (nand, ~, &, char, 1, oldval)
\
do { \
tmp = *ptr; \
failure = __kernel_cmpxchg (tmp, PFX_OP tmp INF_OP val, ptr); \
failure = __kernel_cmpxchg (tmp, PFX_OP (tmp INF_OP val), ptr); \
} while (failure != 0); \
\
return PFX_OP tmp INF_OP val; \
return PFX_OP (tmp INF_OP val); \
}
OP_AND_FETCH_WORD (add, , +)
@ -132,19 +132,19 @@ OP_AND_FETCH_WORD (and, , &)
OP_AND_FETCH_WORD (xor, , ^)
OP_AND_FETCH_WORD (nand, ~, &)
SUBWORD_SYNC_OP (add, , +, short, 2, newval)
SUBWORD_SYNC_OP (sub, , -, short, 2, newval)
SUBWORD_SYNC_OP (or, , |, short, 2, newval)
SUBWORD_SYNC_OP (and, , &, short, 2, newval)
SUBWORD_SYNC_OP (xor, , ^, short, 2, newval)
SUBWORD_SYNC_OP (nand, ~, &, short, 2, newval)
SUBWORD_SYNC_OP (add, , +, unsigned short, 2, newval)
SUBWORD_SYNC_OP (sub, , -, unsigned short, 2, newval)
SUBWORD_SYNC_OP (or, , |, unsigned short, 2, newval)
SUBWORD_SYNC_OP (and, , &, unsigned short, 2, newval)
SUBWORD_SYNC_OP (xor, , ^, unsigned short, 2, newval)
SUBWORD_SYNC_OP (nand, ~, &, unsigned short, 2, newval)
SUBWORD_SYNC_OP (add, , +, char, 1, newval)
SUBWORD_SYNC_OP (sub, , -, char, 1, newval)
SUBWORD_SYNC_OP (or, , |, char, 1, newval)
SUBWORD_SYNC_OP (and, , &, char, 1, newval)
SUBWORD_SYNC_OP (xor, , ^, char, 1, newval)
SUBWORD_SYNC_OP (nand, ~, &, char, 1, newval)
SUBWORD_SYNC_OP (add, , +, unsigned char, 1, newval)
SUBWORD_SYNC_OP (sub, , -, unsigned char, 1, newval)
SUBWORD_SYNC_OP (or, , |, unsigned char, 1, newval)
SUBWORD_SYNC_OP (and, , &, unsigned char, 1, newval)
SUBWORD_SYNC_OP (xor, , ^, unsigned char, 1, newval)
SUBWORD_SYNC_OP (nand, ~, &, unsigned char, 1, newval)
int HIDDEN
__sync_val_compare_and_swap_4 (int *ptr, int oldval, int newval)
@ -194,8 +194,8 @@ __sync_val_compare_and_swap_4 (int *ptr, int oldval, int newval)
} \
}
SUBWORD_VAL_CAS (short, 2)
SUBWORD_VAL_CAS (char, 1)
SUBWORD_VAL_CAS (unsigned short, 2)
SUBWORD_VAL_CAS (unsigned char, 1)
typedef unsigned char bool;
@ -216,8 +216,8 @@ __sync_bool_compare_and_swap_4 (int *ptr, int oldval, int newval)
return (oldval == actual_oldval); \
}
SUBWORD_BOOL_CAS (short, 2)
SUBWORD_BOOL_CAS (char, 1)
SUBWORD_BOOL_CAS (unsigned short, 2)
SUBWORD_BOOL_CAS (unsigned char, 1)
void HIDDEN
__sync_synchronize (void)
@ -259,8 +259,8 @@ __sync_lock_test_and_set_4 (int *ptr, int val)
return (oldval & mask) >> shift; \
}
SUBWORD_TEST_AND_SET (short, 2)
SUBWORD_TEST_AND_SET (char, 1)
SUBWORD_TEST_AND_SET (unsigned short, 2)
SUBWORD_TEST_AND_SET (unsigned char, 1)
#define SYNC_LOCK_RELEASE(TYPE, WIDTH) \
void HIDDEN \

View File

@ -1,3 +1,21 @@
2010-09-07 Ian Bolton <ian.bolton@arm.com>
Backport from mainline
2010-08-19 Ian Bolton <ian.bolton@arm.com>
PR target/45070
* gcc.c-torture/execute/pr45070.c: New.
2010-08-19 Ian Bolton <ian.bolton@arm.com>
* g++.dg/pr44328.C: New test.
2010-08-07 Marcus Shawcroft <marcus.shawcroft@arm.com>
* lib/target-supports.exp: (check_effective_target_sync_int_long):
Add arm*-*-linux-gnueabi.
(check_effective_target_sync_char_short): Likewise.
2010-09-03 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.target/x86_64/abi/avx/abi-avx.exp: Link with

View File

@ -0,0 +1,39 @@
/* { dg-do compile } */
/* { dg-options "-c -O2 -Wextra" } */
#define O_RDONLY (1<<0)
#define O_WRONLY (1<<1)
#define O_RDWR (O_RDONLY|O_WRONLY)
#define O_CREAT (1<<3)
#define O_TRUNC (1<<6)
typedef enum {
OM_READ = 0,
OM_WRITE,
OM_READWRITE_NOCREATE,
OM_READWRITE_CREATE
} OpenMode;
extern int open(const char *name, int mode);
void open_file(const char *filename, const OpenMode rw)
{
int mode = 0;
switch( rw )
{
case OM_WRITE:
mode = O_WRONLY|O_CREAT|O_TRUNC;
break;
case OM_READ:
mode = O_RDONLY;
break;
case OM_READWRITE_NOCREATE:
mode = O_RDWR;
break;
case OM_READWRITE_CREATE:
mode = O_RDWR|O_CREAT|O_TRUNC;
break;
}
open( filename, mode );
}

View File

@ -0,0 +1,52 @@
/* PR45070 */
extern void abort(void);
struct packed_ushort {
unsigned short ucs;
} __attribute__((packed));
struct source {
int pos, length;
int flag;
};
static void __attribute__((noinline)) fetch(struct source *p)
{
p->length = 128;
}
static struct packed_ushort __attribute__((noinline)) next(struct source *p)
{
struct packed_ushort rv;
if (p->pos >= p->length) {
if (p->flag) {
p->flag = 0;
fetch(p);
return next(p);
}
p->flag = 1;
rv.ucs = 0xffff;
return rv;
}
rv.ucs = 0;
return rv;
}
int main(void)
{
struct source s;
int i;
s.pos = 0;
s.length = 0;
s.flag = 0;
for (i = 0; i < 16; i++) {
struct packed_ushort rv = next(&s);
if ((i == 0 && rv.ucs != 0xffff)
|| (i > 0 && rv.ucs != 0))
abort();
}
return 0;
}

View File

@ -2593,6 +2593,7 @@ proc check_effective_target_sync_int_long { } {
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget alpha*-*-*]
|| [istarget arm*-*-linux-gnueabi]
|| [istarget s390*-*-*]
|| [istarget powerpc*-*-*]
|| [istarget sparc64-*-*]
@ -2621,6 +2622,7 @@ proc check_effective_target_sync_char_short { } {
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget alpha*-*-*]
|| [istarget arm*-*-linux-gnueabi]
|| [istarget s390*-*-*]
|| [istarget powerpc*-*-*]
|| [istarget sparc64-*-*]

View File

@ -96,6 +96,7 @@ eight) times the number of the actual switch branches. */
#include "diagnostic.h"
#include "tree-dump.h"
#include "timevar.h"
#include "langhooks.h"
/* The main structure of the pass. */
struct switch_conv_info
@ -658,9 +659,11 @@ gen_inbound_check (gimple swtch)
/* Make sure we do not generate arithmetics in a subrange. */
if (TREE_TYPE (TREE_TYPE (info.index_expr)))
utype = unsigned_type_for (TREE_TYPE (TREE_TYPE (info.index_expr)));
utype = lang_hooks.types.type_for_mode
(TYPE_MODE (TREE_TYPE (TREE_TYPE (info.index_expr))), 1);
else
utype = unsigned_type_for (TREE_TYPE (info.index_expr));
utype = lang_hooks.types.type_for_mode
(TYPE_MODE (TREE_TYPE (info.index_expr)), 1);
/* (end of) block 0 */
gsi = gsi_for_stmt (info.arr_ref_first);