aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2019-12-16 08:03:28 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2019-12-16 08:03:28 +0000
commit070fa48b0a4fbdc754e18962d586f41cc263dad7 (patch)
tree9d4b10d04c6a5cd89453fa4adf9b8e560b6117db
parent438fbf630358e113747c77b5be64fc3c1321d12a (diff)
downloadgcc-070fa48b0a4fbdc754e18962d586f41cc263dad7.zip
gcc-070fa48b0a4fbdc754e18962d586f41cc263dad7.tar.gz
gcc-070fa48b0a4fbdc754e18962d586f41cc263dad7.tar.bz2
Fix PR92950: Wrong code emitted for movv1qi
The backend emits 16 bit memory loads for single element character vector. As a result the character will not be right justified in the GPR. gcc/ChangeLog: 2019-12-16 Andreas Krebbel <krebbel@linux.ibm.com> PR target/92950 * config/s390/vector.md ("mov<mode>" for V_8): Replace lh, lhy, and lhrl with llc. gcc/testsuite/ChangeLog: 2019-12-16 Andreas Krebbel <krebbel@linux.ibm.com> PR target/92950 * gcc.target/s390/vector/pr92950.c: New test. From-SVN: r279410
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/s390/vector.md12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/s390/vector/pr92950.c24
4 files changed, 40 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b892fa..acf14a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-12-16 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ PR target/92950
+ * config/s390/vector.md ("mov<mode>" for V_8): Replace lh, lhy,
+ and lhrl with llc.
+
2019-12-14 Martin Sebor <msebor@redhat.com>
* doc/extend.texi (attribute access): Correct typos.
diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index d40e310..1e591ba 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -291,9 +291,9 @@
; However, this would probably be slower.
(define_insn "mov<mode>"
- [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,d,d,R,T")
- (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,R,T,b,d,d"))]
- ""
+ [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, S, Q, S, d, d,d,R,T")
+ (match_operand:V_8 1 "general_operand" " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,T,d,d"))]
+ "TARGET_VX"
"@
vlr\t%v0,%v1
vlvgb\t%v0,%1,0
@@ -311,12 +311,10 @@
mviy\t%0,-1
lhi\t%0,0
lhi\t%0,-1
- lh\t%0,%1
- lhy\t%0,%1
- lhrl\t%0,%1
+ llc\t%0,%1
stc\t%1,%0
stcy\t%1,%0"
- [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RX,RXY,RIL,RX,RXY")])
+ [(set_attr "op_type" "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RXY,RX,RXY")])
(define_insn "mov<mode>"
[(set (match_operand:V_16 0 "nonimmediate_operand" "=v,v,d,v,R, v, v, v, v,d, Q, Q, d, d,d,d,d,R,T,b")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 591f152..cc1a735 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-12-16 Andreas Krebbel <krebbel@linux.ibm.com>
+
+ PR target/92950
+ * gcc.target/s390/vector/pr92950.c: New test.
+
2019-12-15 Andrew Pinski <apinski@marvell.com>
* gcc.c-torture/compile/bitfield-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/s390/vector/pr92950.c b/gcc/testsuite/gcc.target/s390/vector/pr92950.c
new file mode 100644
index 0000000..9c7ed12
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/vector/pr92950.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z13 --save-temps" } */
+
+struct a {
+ int b;
+ char c;
+};
+struct a d = {1, 16};
+struct a *e = &d;
+
+int f = 0;
+
+int main() {
+ struct a g = {0, 0 };
+ f = 0;
+
+ for (; f <= 1; f++) {
+ g = d;
+ *e = g;
+ }
+
+ if (d.c != 16)
+ __builtin_abort();
+}