2011-06-23 62 views
25

Gần đây tôi đã nhận được một báo cáo lỗi về một chương trình không biên dịch được với công tắc -O3 (xem https://github.com/cschwan/sage-on-gentoo/issues/66). Đặc biệt, vấn đề là biên dịch bị treo tại một điểm nhất định. Vấn đề được giải quyết bằng cách biên dịch với -O2 (Tôi nhận thức rõ thực tế là các chương trình được biên dịch với -O3 có thể bị hỏng, nhưng tôi không biết rằng -O3 có thể treo trình biên dịch). Nếu bạn muốn tạo lại sự cố chạySự khác nhau giữa -O3 và (-O2 + cờ mà gcc người đàn ông nói -O3 thêm vào -O2) là gì?

wget http://perso.ens-lyon.fr/xavier.pujol/fplll/libfplll-3.0.12.tar.gz 
tar -xf libfplll-3.0.12.tar.gz 
cd libfplll-3.0.12 
./configure CXXFLAGS="-O3" 
make 

Tôi tự hỏi tại sao -O3 treo trình biên dịch và vì vậy tôi đã cố gắng theo dõi vấn đề. Đầu tiên, tôi đã cố gắng tìm ra sự khác biệt giữa -O2 giữa -O3. trang man gcc của khẳng định rằng O3 phép tắc của -O2 và những người sau đây (cho phép gọi cho họ x):

-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload 
-ftree-vectorize -fipa-cp-clone 

Tôi xác nhận rằng bằng cách so sánh kết quả của gcc khi gọi với -Q -O2 --help=optimizers-Q -O3 --help=optimizers. Sau đó tôi lên kế hoạch loại bỏ một cách có chọn lọc các công tắc để tìm ra nguyên nhân gây ra sự cố. Tuy nhiên, biên soạn hoạt động tốt với -O2 và thiết bị chuyển mạch bổ sung nêu trên, vì vậy tôi kết luận

-O3 != -O2 x 

Bây giờ câu hỏi của tôi: (? Cung cấp tài liệu) Có ai biết nếu có một sự khác biệt nữa giữa -O2 và O3, có ai trải qua một hành vi tương tự không? Đây có phải là lỗi trình biên dịch không?

+0

Tôi nghĩ rằng, bạn nên thêm vào các vấn đề O3 chạy tùy chọn như "-ftree-dump-all-tất cả -frtl-dump -all-tất cả "và để tìm thấy giai đoạn cuối cùng có một treo trong nó. Ngoài ra, chech ngăn xếp của gcc với bắt đầu nó dưới 'gdb --args' và dừng lại với Ctrl-C. – osgx

Trả lời

18

Trang người dùng có thể đã lỗi thời, nhưng bạn có thể tìm thấy danh sách thực tế cho O2 và O3.

Để có được danh sách đầy đủ (gần, kiểm tra "cập nhật") của -f tùy chọn tối ưu hóa thực tế sử dụng, tôi đề nghị bạn sử dụng -fverbose-asm -save-temps (hoặc -fverbose-asm -S) - có một danh sách đầy đủ tại một đầu của file asm (*. S).

Đối với gcc-4.6.0 tôi đã x (chênh lệch giữa O2 và O3) là:

-fgcse-after-reload 
-finline-functions 
-fipa-cp-clone 
-fpredictive-commoning 
-ftree-loop-distribute-patterns 
-ftree-vectorize 
-funswitch-loops 

Một nguồn thông tin cho câu hỏi của bạn là nguồn của GCC (file gcc/opts.c và có thể gcc/common.opt) như gcc-4.6.0:

/* -O3 optimizations. */ 
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 }, 
/* Inlining of functions reducing size is a good idea with -Os 
    regardless of them being declared inline. */ 
{ OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 }, 

tôi cũng đã kiểm tra, thực hiện kiểm tra gcc -On trong các tập tin khác (cscope biểu tượng tìm kiếm x_optimize).

Cách sử dụng bổ sung duy nhất của n từ tùy chọn -On đang lưu giá trị vào macro __OPTIMIZE__. Vì vậy, một số tiêu đề có thể hoạt động khác với giá trị của macro này bằng 2 hoặc 3.

UPDATE: There are questions about it in GCC WIKI:

  • "? là -O1 (-O2, O3 hoặc -os) tương đương với tùy chọn -foptimization cá nhân"

số đầu tiên, tùy chọn tối ưu hóa riêng lẻ (-f *) không cho phép tối ưu hóa, tùy chọn -Os hoặc -Ox với x> 0 là bắt buộc. Thứ hai, các cờ -Ox cho phép nhiều tối ưu hóa không được kiểm soát bởi bất kỳ tùy chọn cá nhân -f * nào. There are no plans to add individual options for controlling all these optimizations.

  • "gì cờ cụ thể được kích hoạt bởi -O1 (-O2, O3 hoặc -os)?"

Khác nhau bởi nền tảng và phiên bản GCC. Bạn có thể nhận GCC để cho bạn biết những gì cờ nó cho phép bằng cách làm này:

touch empty.c 
gcc -O1 -S -fverbose-asm empty.c 
cat empty.s 
+4

Câu trả lời của bạn đã cho tôi gợi ý đúng - trong gcc/opts.c tôi tìm thấy các tham số bổ sung được thiết lập với -O3: 'max-aliased-vops' và' avg-aliased-vops'. Sau này là nguồn gốc của vấn đề của tôi. Khi được đặt thành '3' (mặc định cho -O3), trình biên dịch sẽ hiển thị cùng một hành vi. Cảm ơn! – cschwan

+0

Vì mục đích hoàn chỉnh: 'max-partial-antic-length' cũng được thực hiện bởi -O3. Điều này cũng được ghi lại chính xác trong trang man của gcc, mặc dù nó không được đề cập trong phần mô tả của -O3. – cschwan

+0

cschwan, tôi rất vui khi biết rằng bạn tìm thấy vấn đề, nhưng tôi nghĩ rằng * vops và * antic * được thêm vào trong phiên bản gentoo của gcc hoặc smth, vì không có tùy chọn nào trong "vanilla" gcc-4.6 – osgx

3

Nếu trình biên dịch của bạn bị treo, thì có - tôi sẽ coi đó là lỗi trình biên dịch. Các trình biên dịch cũng có lỗi.

(ngay cả khi trình biên dịch sử dụng để biên dịch biên dịch của bạn có lỗi, một lỗi có thể được giới thiệu trong các trình biên dịch mới - gcc mất một số bước để tránh điều đó bằng bootstrapping dàn của nó mặc dù.)

Nó có thể là những thứ khác là tốt, ví dụ việc tối ưu hóa được thực hiện chỉ tốn nhiều thời gian, nhiều thời gian hơn để thực hiện, hoặc mức tối ưu hóa tăng lên khiến cho bộ nhớ được sử dụng nhiều hơn và hệ thống của bạn bắt đầu tấn công.

Các vấn đề liên quan