Re: vs2012 , ошибка оптимизатора?
Здравствуйте, Chorkov, Вы писали:
Ассемблер покажи.
Поскольку ошибка идет через два дабла, есть мнение, что для негоциации используется неправильная маска в xmm регистре, при этом скорее всего умный оптимизатор подгружает туда сразу два дабла, отсюда первый отрабатывает нормально, а второй портится маской.
<Подпись удалена модератором>
Re: vs2012 , ошибка оптимизатора?
Здравствуйте, Chorkov,
Здесь тоже...
Feierlich, misterioso
Re[3]: vs2012 , ошибка оптимизатора?
К>>На 17.00.50727.1 не воспроизвелась.
К>Опа! Воспроизвелось.
К>Что-то я не понимаю. Только что не воспроизводилось... всего-то, компьютер перезагрузил.
К>Итак, VS2010 — не воспроизводится, 2012 — воспроизводится, причём для разных платформ по-разному
К>amd64 и x86_amd64 — ошибки в i=1, 3; x86 — i=1, 3, 5.
Уважаемые коллеги, давайте сделаем единообразные тесты на доступных компиляторах (VS10, 11, 12), для отправки bug reprort.
main.cpp:
#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;
__forceinline
size_t index(size_t i, size_t size)
{
return i*(size+1);
}
__declspec (noinline) // affects bug
void foo(size_t size, const double * const X, double * const Y)
{
for (size_t i=0; i!=size; ++i) // replacing size_t with unsigned affects bug
Y[i] = -X[index(i, size)]; // negation affects bug
}
int main()
{
const size_t size = 100;
cout << "size=" << size << endl;
double X[size*size], Y[size];
iota(begin(X), end(X), 1000.);
foo(size, X, Y);
size_t errors = 0;
for (size_t i=0; i!=size; ++i)
{
const double x = X[index(i, size)], y = -Y[i];
if (x != y)
{
++errors;
if (errors < 5)
cout << "i=" << i
<< " x=" << x << " y=" << y << endl;
}
}
cout << "total errors=" << errors << endl;
}
test.cmd:
cl
cl -Od main.cpp >> out.txt 2> err.txt
main.exe
del main.exe
cl -O2 main.cpp >> out.txt 2> err.txt
main.exe
del main.exe
Вывод MSVC2010 x32:
C:\vs2012_fp_bug>test.cmd
C:\vs2012_fp_bug>cl
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 16.00.40219.01 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
использование: cl [ параметр... ] имя_файла... [ /link параметр_компоновки... ]
C:\vs2012_fp_bug>cl -Od main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
C:\vs2012_fp_bug>cl -O2 main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
MSVC2010 x64:
C:\vs2012_fp_bug>test.cmd
C:\vs2012_fp_bug>cl
Оптимизирующий компилятор Microsoft (R) C/C++ версии 16.00.40219.01 для x64
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
использование: cl [ параметр... ] имя_файла... [ /link параметр_компоновки... ]
C:\vs2012_fp_bug>cl -Od main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
C:\vs2012_fp_bug>cl -O2 main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
MSVC2012 x32:
C:\vs2012_fp_bug>test.cmd
C:\vs2012_fp_bug>cl
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
C:\vs2012_fp_bug>cl -Od main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
C:\vs2012_fp_bug>cl -O2 main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
C:\vs2012_fp_bug>del main.exe
MSVC2012 x64:
C:\vs2012_fp_bug>test.cmd
C:\vs2012_fp_bug>cl
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
C:\vs2012_fp_bug>cl -Od main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
total errors=0
C:\vs2012_fp_bug>del main.exe
C:\vs2012_fp_bug>cl -O2 main.cpp 1>>out.txt 2>err.txt
C:\vs2012_fp_bug>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
C:\vs2012_fp_bug>del main.exe
Re[4]: vs2012 , ошибка оптимизатора?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Уважаемые коллеги, давайте сделаем единообразные тесты на доступных компиляторах (VS10, 11, 12), для отправки bug reprort.
MSVC 2013
Вывод x64 Cross
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
D:\work\temp\1>cl -Od main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
total errors=0
D:\work\temp\1>del main.obj
D:\work\temp\1>del main.exe
D:\work\temp\1>cl -O2 main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
x64 Native
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
D:\work\temp\1>cl -Od main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
total errors=0
D:\work\temp\1>del main.obj
D:\work\temp\1>del main.exe
D:\work\temp\1>cl -O2 main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
x86 Native
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
D:\work\temp\1>cl -Od main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
total errors=0
D:\work\temp\1>del main.obj
D:\work\temp\1>del main.exe
D:\work\temp\1>cl -O2 main.cpp 1>>out.txt 2>err.txt
D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
Re[5]: vs2012 , ошибка оптимизатора?
Здравствуйте, pentagra, Вы писали:
Коллеги, покажите же асм этого дела, интересно как он начудил.
<Подпись удалена модератором>
Re[6]: vs2012 , ошибка оптимизатора?
Здравствуйте, denisko, Вы писали:
D>Коллеги, покажите же асм этого дела, интересно как он начудил.
VS2012 x64 O2
C:\vs2012_fp_bug>cl -O2 /FA main.cpp
; Function compile flags: /Ogtpy
; COMDAT ?foo@@YAX_KQEBNQEAN@Z
_TEXT SEGMENT
size $ = 16
X$ = 24
Y$ = 32
?foo@@YAX_KQEBNQEAN@Z PROC ; foo, COMDAT
; File c :\vs2012_fp_bug\main.cpp
; Line 14
$LN18:
sub rsp, 8
; Line 15
xor r9d, r9d
mov r11, rdx
mov r10, rcx
test rcx, rcx
je $LN1@foo
movapd xmm1, XMMWORD PTR __xmm@80000000000000008000000000000000
cmp rcx, 4
jb $LN11@foo
; Line 16
mov QWORD PTR [rsp+16], rbx
lea rbx, QWORD PTR [rcx+1]
lea rdx, QWORD PTR [r8-8]
lea rdx, QWORD PTR [rdx+rcx*8]
lea rcx, QWORD PTR [rcx*2-1]
lea rbx, QWORD PTR [r11+rbx*8]
lea rcx, QWORD PTR [rcx+1]
lea rcx, QWORD PTR [r11+rcx*8]
cmp r8, rcx
ja SHORT $LN12@foo
cmp rdx, rbx
jae SHORT $LN16@foo
$LN12@foo:
mov rax, r10
mov QWORD PTR [rsp], rdi
lea rbx, QWORD PTR [r10+1]
and eax , 3
; Line 15
lea rdi, QWORD PTR [r10+1]
mov rdx, r10
sub rdx, rax
shl rbx, 5
mov rcx, r8
mov rax, r11
add rdi, rdi
npad 4
$LL3@foo:
; Line 16
movupd xmm0, XMMWORD PTR [rax]
add r9, 4
lea rcx, QWORD PTR [rcx+32]
xorpd xmm0, xmm1
movupd XMMWORD PTR [rcx-32], xmm0
movupd xmm0, XMMWORD PTR [rax+rdi*8]
add rax, rbx
xorpd xmm0, xmm1
movupd XMMWORD PTR [rcx-16], xmm0
cmp r9, rdx
jne SHORT $LL3@foo
mov rdi, QWORD PTR [rsp]
$LN16@foo:
mov rbx, QWORD PTR [rsp+16]
$LN11@foo:
; Line 15
cmp r9, r10
je SHORT $LN1@foo
lea rax, QWORD PTR [r10+1]
lea rdx, QWORD PTR [r10*8+8]
imul rax, r9
lea rcx, QWORD PTR [r11+rax*8]
npad 3
$LL10@foo:
; Line 16
movsdx xmm0, QWORD PTR [rcx]
inc r9
add rcx, rdx
xorpd xmm0, xmm1
movsdx QWORD PTR [r8+r9*8-8], xmm0
cmp r9, r10
jne SHORT $LL10@foo
$LN1@foo:
; Line 17
add rsp, 8
ret 0
?foo@@YAX_KQEBNQEAN@Z ENDP ; foo
Re[5]: vs2012 , ошибка оптимизатора?
Здравствуйте, pentagra, Вы писали:
P>...
Это баг векторизатора. Соответственно, воркараунд — #pragma loop(no_vector) перед циклом в void foo()
Создал баг в бекенде.
А ти, москалику, вже приїхав (с)
Re[7]: vs2012 , ошибка оптимизатора?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, denisko, Вы писали:
D>>Коллеги, покажите же асм этого дела, интересно как он начудил.
Спасиб, конечно, но foo то мне зачем? Ошибка почти наверняка здесь
const double x = X[index(i, size)], y = -Y[i];
if(x != y)
<Подпись удалена модератором>
Re[8]: vs2012 , ошибка оптимизатора?
Здравствуйте, denisko, Вы писали:
D>>>Коллеги, покажите же асм этого дела, интересно как он начудил.
D>Спасиб, конечно, но foo то мне зачем? Ошибка почти наверняка здесь
D>D>const double x = X[index(i, size)], y = -Y[i];
D> if(x != y)
D>
Баг не в проверке, а в том что Y заполняется не теми значениями внутри foo.
Re[6]: vs2012 , ошибка оптимизатора?
Здравствуйте, MT-Wizard, Вы писали:
MW>Создал баг в бекенде.
Ссылка?
Re[7]: vs2012 , ошибка оптимизатора?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, MT-Wizard, Вы писали:
MW>>Создал баг в бекенде.
EP>Ссылка?
А разве внутренний ТФС выставлен наружу?
А ти, москалику, вже приїхав (с)
Re[8]: vs2012 , ошибка оптимизатора?
Здравствуйте, MT-Wizard, Вы писали:
MW>>>Создал баг в бекенде.
EP>>Ссылка?
MW>А разве внутренний ТФС выставлен наружу?
Я думал ты создал на
https://connect.microsoft.com/VisualStudio/feedback/
Re[7]: vs2012 , ошибка оптимизатора?
От:
ArtDenis
Дата: 16.04.14 01:55
Оценка:
Здравствуйте, Аноним, Вы писали:
AD>>На VS2013 не проявляется.
А>Проявляется
Хм. Точно. А из студии если компилить, то не хочет.
Re[8]: vs2012 , ошибка оптимизатора?
От:
ArtDenis
Дата: 16.04.14 02:05
Оценка:
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, Аноним, Вы писали:
AD>>>На VS2013 не проявляется.
А>>Проявляется
AD>Хм. Точно. А из студии если компилить, то не хочет.
Похоже всё дело в опции /GL (global optimization). Если её включить, то баг не проявляется.
Re: vs2012 , ошибка оптимизатора?
Здравствуйте, Chorkov, Вы писали:
C>Здравствуйте,
C>Подозреваю, что нашел ошибку компилятора.
C>Проявляется в релизе на 2012-я студии (17.00.61030).
То майкрософт, он всегда глючным считался.
Вот я вчера g++ 4.8.1 завалил с ошибкой internal compiler error: Segmentation fault.
Скрытый текст struct CLEntry
{
const char * const longName;
const int paramType;
const int isRequired;
};
constexpr CLEntry table[] =
{
{ "--file" , 1, 0 },
};
#define countof(x) (sizeof (x) / sizeof ((x)[0]))
static_assert(countof(table) <= 0 || table[0].paramType != 0 || table[0].isRequired != 1, "row 0: must be ..." ); // this line crashes the compiler! g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
Re[4]: vs2012 , ошибка оптимизатора?
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить