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
và -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?
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