View | Details | Return to bug 103842
Collapse All | Expand All

(-)gcc/config/i386/mmx.md.jj (-4 / +6 lines)
Lines 529-545 (define_expand "divv2sf3" Link Here
529
		  (match_operand:V2SF 2 "register_operand")))]
529
		  (match_operand:V2SF 2 "register_operand")))]
530
  "TARGET_MMX_WITH_SSE"
530
  "TARGET_MMX_WITH_SSE"
531
{
531
{
532
  rtx op0 = lowpart_subreg (V4SFmode, operands[0],
532
  rtx op1 = lowpart_subreg (V4SFmode, force_reg (V2SFmode, operands[1]),
533
			    GET_MODE (operands[0]));
533
			    V2SFmode);
534
  rtx op1 = lowpart_subreg (V4SFmode, operands[1],
535
			    GET_MODE (operands[1]));
536
  rtx op2 = gen_rtx_VEC_CONCAT (V4SFmode, operands[2],
534
  rtx op2 = gen_rtx_VEC_CONCAT (V4SFmode, operands[2],
537
				force_reg (V2SFmode, CONST1_RTX (V2SFmode)));
535
				force_reg (V2SFmode, CONST1_RTX (V2SFmode)));
538
  rtx tmp = gen_reg_rtx (V4SFmode);
536
  rtx tmp = gen_reg_rtx (V4SFmode);
539
537
540
  emit_insn (gen_rtx_SET (tmp, op2));
538
  emit_insn (gen_rtx_SET (tmp, op2));
541
539
540
  rtx op0 = gen_reg_rtx (V4SFmode);
541
542
  emit_insn (gen_divv4sf3 (op0, op1, tmp));
542
  emit_insn (gen_divv4sf3 (op0, op1, tmp));
543
544
  emit_move_insn (operands[0], lowpart_subreg (V2SFmode, op0, V4SFmode));
543
  DONE;
545
  DONE;
544
})
546
})
545
547
(-)gcc/testsuite/g++.dg/opt/pr103842.C.jj (+31 lines)
Line 0 Link Here
1
// PR target/103842
2
// { dg-do compile }
3
// { dg-options "-O3 -std=c++14" }
4
5
void foo (float *);
6
struct M {
7
  float x[3][3];
8
  float *operator[](int i) { return x[i]; }
9
  M();
10
  M(float f, float g) {
11
    x[1][0] = x[1][1] = x[1][2] = f;
12
    x[2][0] = g;
13
  }
14
  void bar();
15
  M baz() {
16
    M s(x[1][2] - x[1][2], x[1][1] - x[1][1]);
17
    float r = s[2][0];
18
    if (r)
19
      for (int i = 0; i < 3; ++i)
20
	for (int j = 0; j < 3; ++j)
21
	  s[i][j] /= r;
22
    for (int i = 0;;) {
23
      float *t = s[i];
24
      foo(t);
25
    }
26
  }
27
};
28
void qux() {
29
  M m, i = m.baz(), j = i;
30
  j.bar();
31
}

Return to bug 103842