Created attachment 27440 [details] Reduced test case The attached file prints different output depending whether it is compiled with -O0, -O1 or -O2 on gcc-Version 4.7.0 20120507 (Red Hat 4.7.0-5) (GCC). When the file is built with gcc -std=c99 -mrdrnd -O0 rngtest.i, it prints four different random numbers. If it is built with gcc -std=c99 -mrdrnd -O1 rngtest.i, it prints the same number four times. If it is built with gcc -std=c99 -mrdrnd -O2 rngtest.i, it prints the random number four times and prints the random number as the result of the call to _rdrand32_step. The last one is especially surprising, because _rdrand32_step should only return 0 or 1.
A patch is posted at http://gcc.gnu.org/ml/gcc-patches/2012-05/msg01338.html
Author: hjl Date: Mon May 21 12:31:45 2012 New Revision: 187709 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=187709 Log: Use unspec_volatile on rdrand<mode>_1 gcc/ PR target/53416 * config/i386/i386.md (UNSPEC_RDRAND): Renamed to ... (UNSPECV_RDRAND): This. (rdrand<mode>_1): Updated. gcc/testsuite/ PR target/53416 * gcc.target/i386/pr53416.c: New file. Added: trunk/gcc/testsuite/gcc.target/i386/pr53416.c Modified: trunk/gcc/ChangeLog trunk/gcc/config/i386/i386.md trunk/gcc/testsuite/ChangeLog
Author: hjl Date: Mon May 21 12:59:53 2012 New Revision: 187712 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=187712 Log: Use unspec_volatile on rdrand<mode>_1 gcc/ Backport from mainline PR target/53416 * config/i386/i386.md (UNSPEC_RDRAND): Renamed to ... (UNSPECV_RDRAND): This. (rdrand<mode>_1): Updated. gcc/testsuite/ Backport from mainline PR target/53416 * gcc.target/i386/pr53416.c: New file. Added: branches/gcc-4_6-branch/gcc/testsuite/gcc.target/i386/pr53416.c Modified: branches/gcc-4_6-branch/gcc/ChangeLog branches/gcc-4_6-branch/gcc/config/i386/i386.md branches/gcc-4_6-branch/gcc/testsuite/ChangeLog
Author: hjl Date: Mon May 21 13:07:11 2012 New Revision: 187713 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=187713 Log: Use unspec_volatile on rdrand<mode>_1 gcc/ Backport from mainline PR target/53416 * config/i386/i386.md (UNSPEC_RDRAND): Renamed to ... (UNSPECV_RDRAND): This. (rdrand<mode>_1): Updated. gcc/testsuite/ Backport from mainline PR target/53416 * gcc.target/i386/pr53416.c: New file. Added: branches/gcc-4_7-branch/gcc/testsuite/gcc.target/i386/pr53416.c Modified: branches/gcc-4_7-branch/gcc/ChangeLog branches/gcc-4_7-branch/gcc/config/i386/i386.md branches/gcc-4_7-branch/gcc/testsuite/ChangeLog
Fixed.