Hi all,
  Since Ada is not always tested and I had received a testcase from a
customer for the same issue (I had backported the patch which caused
it), I thought I would create a full testcase that fails with C code.

NOTE this does not fail on x86_64 (nor aarch64) before the patch for
PR86659 due to SLOW_BYTE_ACCESS set to 0.  But I changed
SLOW_BYTE_ACCESS to be 1 when I was testing the code.

Committed as obvious after a simple test.

Thanks,
Andrew Pinski

testsuite/ChangeLog:
2019-12-13  Andrew Pinski  <apin...@marvell.com>

       * gcc.c-torture/execute/pr86659-1.c: New test.
       * gcc.c-torture/execute/pr86659-2.c: New test.
Index: ChangeLog
===================================================================
--- ChangeLog   (revision 279337)
+++ ChangeLog   (working copy)
@@ -1,3 +1,8 @@
+2019-12-13  Andrew Pinski  <apin...@marvell.com>
+
+       * gcc.c-torture/execute/pr86659-1.c: New test.
+       * gcc.c-torture/execute/pr86659-2.c: New test.
+
 2019-12-12  Jakub Jelinek  <ja...@redhat.com>
 
        PR target/92904
Index: gcc.c-torture/execute/pr86659-1.c
===================================================================
--- gcc.c-torture/execute/pr86659-1.c   (nonexistent)
+++ gcc.c-torture/execute/pr86659-1.c   (working copy)
@@ -0,0 +1,42 @@
+#define ENDIANBIG __attribute((scalar_storage_order ("big-endian")))
+
+typedef struct ENDIANBIG 
+{
+  unsigned long long  field0:29;
+  unsigned long long  field1:4; 
+  unsigned long long  field2:31;
+}struct1;  
+
+int
+main(void)
+{
+  int value1 = 0;
+  int value2 = 0;
+  int value3 = 0;
+  unsigned int flag;
+  struct1 var1;
+  var1.field0 = 23;
+  
+  flag = var1.field0;
+  value1 = ((var1.field0)?10:20);
+  if(var1.field0)
+    {
+      value2 =  10;
+    } else
+    {
+      value2 = 20;
+    }
+
+  value3 = ((flag)?10:20);
+
+  if (value1 != 10)
+    __builtin_abort ();
+
+  if (value2 != 10)
+    __builtin_abort ();
+
+  if (value3 != 10)
+    __builtin_abort ();
+
+  return 0;
+}
Index: gcc.c-torture/execute/pr86659-2.c
===================================================================
--- gcc.c-torture/execute/pr86659-2.c   (nonexistent)
+++ gcc.c-torture/execute/pr86659-2.c   (working copy)
@@ -0,0 +1,42 @@
+#define ENDIANBIG __attribute((scalar_storage_order ("little-endian")))
+
+typedef struct ENDIANBIG 
+{
+  unsigned long long  field0:29;
+  unsigned long long  field1:4; 
+  unsigned long long  field2:31;
+}struct1;  
+
+int
+main(void)
+{
+  int value1 = 0;
+  int value2 = 0;
+  int value3 = 0;
+  unsigned int flag;
+  struct1 var1;
+  var1.field0 = 23;
+  
+  flag = var1.field0;
+  value1 = ((var1.field0)?10:20);
+  if(var1.field0)
+    {
+      value2 =  10;
+    } else
+    {
+      value2 = 20;
+    }
+
+  value3 = ((flag)?10:20);
+
+  if (value1 != 10)
+    __builtin_abort ();
+
+  if (value2 != 10)
+    __builtin_abort ();
+
+  if (value3 != 10)
+    __builtin_abort ();
+
+  return 0;
+}

Reply via email to