Pass unpromoted argument to promote_function_mode
authorH.J. Lu <hongjiu.lu@intel.com>
Fri, 28 Nov 2014 15:27:55 +0000 (15:27 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 28 Nov 2014 15:27:55 +0000 (07:27 -0800)
This patch updates setup_incoming_promotions in combine.c to match what
is actually passed in assign_parm_setup_reg in function.c.

gcc/

PR rtl-optimization/64037
* combine.c (setup_incoming_promotions): Pass the argument
before any promotions happen to promote_function_mode.

gcc/testsuite/

PR rtl-optimization/64037
* g++.dg/pr64037.C: New test.

From-SVN: r218161

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr64037.C [new file with mode: 0644]

index e77895161cafe8ef3d88039f871ab07a42067752..4ce634ac0800c1c3a56a4324adc8f0ce6dccf645 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR rtl-optimization/64037
+       * combine.c (setup_incoming_promotions): Pass the argument
+       before any promotions happen to promote_function_mode.
+
 2014-11-28  Evgeny Stupachenko  <evstupac@gmail.com>
 
        * tree-vect-data-refs.c (vect_transform_grouped_load): Limit shift
index 1808f9702fbac1c656c703329387108f5068bcc2..a0449a23b18093885f6ec480f25aef361b851ee1 100644 (file)
@@ -1561,8 +1561,8 @@ setup_incoming_promotions (rtx_insn *first)
       uns3 = TYPE_UNSIGNED (DECL_ARG_TYPE (arg));
 
       /* The mode and signedness of the argument as it is actually passed,
-         after any TARGET_PROMOTE_FUNCTION_ARGS-driven ABI promotions.  */
-      mode3 = promote_function_mode (DECL_ARG_TYPE (arg), mode2, &uns3,
+         see assign_parm_setup_reg in function.c.  */
+      mode3 = promote_function_mode (TREE_TYPE (arg), mode1, &uns1,
                                     TREE_TYPE (cfun->decl), 0);
 
       /* The mode of the register in which the argument is being passed.  */
index 14302b71688008bebc63b8db8ece01ae44f18493..ebd899d694260af88015d12ca111f024989c9918 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR rtl-optimization/64037
+       * g++.dg/pr64037.C: New test.
+
 2014-11-28  Evgeny Stupachenko  <evstupac@gmail.com>
 
        * gcc.target/i386/pr52252-atom-1.c: Delete.
diff --git a/gcc/testsuite/g++.dg/pr64037.C b/gcc/testsuite/g++.dg/pr64037.C
new file mode 100644 (file)
index 0000000..e5cd0e2
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-options "-std=c++11 -Os" }
+
+enum class X : unsigned char {
+  V = 2,
+};
+
+static void
+__attribute__((noinline,noclone))
+foo(unsigned &out, unsigned a, X b)
+{
+  out = static_cast<unsigned>(b);
+}
+
+int main()
+{
+  unsigned deadbeef = 0xDEADBEEF;
+  asm volatile ("" : "+d" (deadbeef), "+c" (deadbeef));
+
+  unsigned out;
+  foo(out, 2, X::V);
+
+  if (out != 2)
+    __builtin_abort ();
+
+  return 0;
+}