Search

Compiler bug for 64-bit release? by Paulina Bustos Arellano

Closed
as Fixed Help for as Fixed

1
0
Sign in
to vote
Type: Bug
ID: 661810
Opened: 4/14/2011 10:14:49 PM
Access Restriction: Public
0
Workaround(s)
0
User(s) can reproduce this bug
Hi
The following problem occurred in my chess engine. I reduced the code in order to focus on the problem. Therefore, the follwing code is senseless and only serves to demonstrate the compiler problem. The mode of compilation was 64-bit release with optimization for speed, especially with the flag Ob1 or Ob2 (important).

The console output of the following simple code depends on the compiler respectively the compiler flags. The correct console output should be (Intel, GCC, MS 2008, ...):

value........50100
temp.........50100

Only with the Microsoft Visual Studio 2010 Professional in 64-bit release mode with the optimization flags and Ob1 or Ob2, you can see the following wrong console output:

value........50000
temp.........50000

Here you find the code. If you implement further printf_s() instructions the mistake disappears.

#include <stdio.h>

const int IS_ENPASSANT = 1 << 15;

struct move_info_c { int move, value; };
struct board_c { int piece_on[64]; } B;

inline int move_to(int move) { return move & 63; }
inline int move_from(int move) { return (move >> 6) & 63; }
inline int move_is_enpassant(int move) { return (move & IS_ENPASSANT) != 0; }
inline int make_enpassant(int from, int to) { return to | (from << 6) | IS_ENPASSANT; }
inline int piece_on_square(int square) { return B.piece_on[square]; }
inline int move_is_capture(int move) { return (piece_on_square(move_to(move)) != 6) || move_is_enpassant(move); }
inline int move_piece(int move) { return piece_on_square(move_from(move)); }
inline int move_piece_captured(int move) { return move_is_enpassant(move) ? 0 : piece_on_square(move_to(move)); }

inline int piece_value_midgame(int piece) {
int piece_value_mg[7] = {100, 300, 400, 500, 900, 1000, 0};
return piece_value_mg[piece];
}

void initialize() {
for (int square = 0; square < 64; square++) B.piece_on[square] = 6;
B.piece_on[28] = B.piece_on[29] = 0;
}

class sort_c {
public:
sort_c();
move_info_c * last_move, move_list[256];
};

sort_c::sort_c() {
move_list[0].move = make_enpassant(28, 21);
move_info_c * current = move_list;
int move = current->move, value = 0, temp = 0;

if (value < 0) current->value = value;
else if (move_is_capture(move)) {
temp = 50000 + piece_value_midgame(move_piece_captured(move)) - move_piece(move);
current->value = temp;
}
else current->value = 0;

printf_s("value...........%d\n", current->value);
printf_s("temp............%d\n", temp);
}

int main() {
initialize();
sort_c s;
return 0;
}
Details (expand)

Visual Studio/Silverlight/Tooling version

Visual Studio 2010

What category (if any) best represents this feedback?

 

Steps to reproduce

See the C++ code above. Create a new C++ console project and compile the code as 64-bit release with optimization for speed and the compiler flag Ob1 or Ob2.

Product Language

German

Operating System

Windows 7

Operating System Language

German

Actual results

Wrong console output:
value........50000
temp.........50000

Expected results

Correct console output:
value........50100
temp.........50100
File Attachments
0 attachments
Sign in to post a comment.
Posted by Microsoft on 10/31/2011 at 10:37 PM
the fix for this bug will be available in next release
Posted by MS-Moderator10 on 5/25/2011 at 7:53 PM
Thank you for your feedback, we are currently reviewing the issue you have submitted. If this issue is urgent, please contact support directly(http://support.microsoft.com)
Sign in to post a workaround.