Re: vs2012 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 09:41
Оценка:
Здравствуйте, Chorkov, Вы писали:
Ассемблер покажи.
Поскольку ошибка идет через два дабла, есть мнение, что для негоциации используется неправильная маска в xmm регистре, при этом скорее всего умный оптимизатор подгружает туда сразу два дабла, отсюда первый отрабатывает нормально, а второй портится маской.
<Подпись удалена модератором>
Re: vs2012 , ошибка оптимизатора?
От: FoolS.Top Армения  
Дата: 15.04.14 11:31
Оценка:
Здравствуйте, Chorkov,

Здесь тоже...
Feierlich, misterioso
Re[3]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 14:04
Оценка: 15 (1)
К>>На 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 , ошибка оптимизатора?
От: pentagra  
Дата: 15.04.14 14:43
Оценка: 16 (1)
Здравствуйте, 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 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 15:54
Оценка:
Здравствуйте, pentagra, Вы писали:

Коллеги, покажите же асм этого дела, интересно как он начудил.
<Подпись удалена модератором>
Re[6]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 16:26
Оценка:
Здравствуйте, 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 , ошибка оптимизатора?
От: MT-Wizard Украина  
Дата: 15.04.14 16:37
Оценка:
Здравствуйте, pentagra, Вы писали:

P>...


Это баг векторизатора. Соответственно, воркараунд — #pragma loop(no_vector) перед циклом в void foo()
Создал баг в бекенде.
А ти, москалику, вже приїхав (с)
Re[7]: vs2012 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 16:43
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, denisko, Вы писали:


D>>Коллеги, покажите же асм этого дела, интересно как он начудил.

Спасиб, конечно, но foo то мне зачем? Ошибка почти наверняка здесь

const double x = X[index(i, size)], y = -Y[i];
        if(x != y)
<Подпись удалена модератором>
Re[8]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 17:27
Оценка:
Здравствуйте, 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 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 17:32
Оценка:
Здравствуйте, MT-Wizard, Вы писали:

MW>Создал баг в бекенде.


Ссылка?
Re[7]: vs2012 , ошибка оптимизатора?
От: MT-Wizard Украина  
Дата: 15.04.14 19:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, MT-Wizard, Вы писали:


MW>>Создал баг в бекенде.


EP>Ссылка?


А разве внутренний ТФС выставлен наружу?
А ти, москалику, вже приїхав (с)
Re[8]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 19:30
Оценка:
Здравствуйте, 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 , ошибка оптимизатора?
От: antonio_banderas Россия  
Дата: 16.04.14 15:11
Оценка:
Здравствуйте, 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 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 16.04.14 15:37
Оценка:
Сделал bug report.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.