mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37014
 | |
| 
 | |
| --- a/gcc/dojump.c
 | |
| +++ b/gcc/dojump.c
 | |
| @@ -307,8 +307,6 @@
 | |
|  	break;
 | |
|        }
 | |
|  
 | |
| -    case TRUTH_ANDIF_EXPR:
 | |
| -    case TRUTH_ORIF_EXPR:
 | |
|      case COMPOUND_EXPR:
 | |
|        /* Lowered by gimplify.c.  */
 | |
|        gcc_unreachable ();
 | |
| @@ -518,6 +516,7 @@
 | |
|        if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
 | |
|  	goto normal;
 | |
|  
 | |
| +    case TRUTH_ANDIF_EXPR:
 | |
|        if (if_false_label == NULL_RTX)
 | |
|          {
 | |
|  	  drop_through_label = gen_label_rtx ();
 | |
| @@ -538,6 +537,7 @@
 | |
|        if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
 | |
|  	goto normal;
 | |
|  
 | |
| +    case TRUTH_ORIF_EXPR:
 | |
|        if (if_true_label == NULL_RTX)
 | |
|  	{
 | |
|            drop_through_label = gen_label_rtx ();
 | |
| --- a/gcc/expr.c
 | |
| +++ b/gcc/expr.c
 | |
| @@ -8556,7 +8556,10 @@
 | |
|        /* If no set-flag instruction, must generate a conditional store
 | |
|  	 into a temporary variable.  Drop through and handle this
 | |
|  	 like && and ||.  */
 | |
| -
 | |
| +      /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
 | |
| +	 are occassionally created by folding during expansion.  */
 | |
| +    case TRUTH_ANDIF_EXPR:
 | |
| +    case TRUTH_ORIF_EXPR:
 | |
|        if (! ignore
 | |
|  	  && (target == 0
 | |
|  	      || modifier == EXPAND_STACK_PARM
 | |
| @@ -8754,8 +8767,6 @@
 | |
|      case POSTDECREMENT_EXPR:
 | |
|      case LOOP_EXPR:
 | |
|      case EXIT_EXPR:
 | |
| -    case TRUTH_ANDIF_EXPR:
 | |
| -    case TRUTH_ORIF_EXPR:
 | |
|        /* Lowered by gimplify.c.  */
 | |
|        gcc_unreachable ();
 | |
|  
 | |
| --- /dev/null
 | |
| +++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
 | |
| @@ -0,0 +1,21 @@
 | |
| +/* PR middle-end/37014 */
 | |
| +
 | |
| +void bar (signed char *);
 | |
| +
 | |
| +void
 | |
| +foo (int x, int y)
 | |
| +{
 | |
| +  int i;
 | |
| +  signed char a[123], b[123], c;
 | |
| +  for (i = 0; i < 123; i++)
 | |
| +    {
 | |
| +      int e = y - x;
 | |
| +      int d = e < 0 ? -e : e;
 | |
| +      c = d < 75;
 | |
| +      a[y] = c;
 | |
| +      b[y] = c;
 | |
| +      y--;
 | |
| +    }
 | |
| +  bar (b);
 | |
| +  bar (a);
 | |
| +}
 |