คำถามติดแท็ก llvm-codegen

5
มาตรฐาน C ++ อนุญาตให้บูลที่ไม่กำหนดค่าเริ่มต้นขัดข้องโปรแกรมหรือไม่
ฉันรู้ว่า"พฤติกรรมที่ไม่ได้กำหนด"ใน C ++ สามารถอนุญาตให้คอมไพเลอร์ทำสิ่งที่ต้องการได้ อย่างไรก็ตามฉันมีข้อผิดพลาดที่ทำให้ฉันประหลาดใจเพราะฉันคิดว่ารหัสนั้นปลอดภัยพอ ในกรณีนี้ปัญหาจริงเกิดขึ้นเฉพาะแพลตฟอร์มที่ใช้คอมไพเลอร์เฉพาะและเฉพาะในกรณีที่เปิดใช้งานการเพิ่มประสิทธิภาพ ฉันลองหลายสิ่งหลายอย่างเพื่อทำให้เกิดปัญหาอีกครั้งและทำให้มันง่ายขึ้นสูงสุด นี่คือการแยกฟังก์ชั่นที่เรียกSerializeว่าจะใช้พารามิเตอร์บูลและคัดลอกสตริงtrueหรือfalseไปยังบัฟเฟอร์ปลายทางที่มีอยู่ ฟังก์ชั่นนี้จะอยู่ในการตรวจสอบรหัสหรือไม่ไม่มีทางที่จะบอกได้ว่าในความเป็นจริงอาจมีปัญหาหากพารามิเตอร์ bool เป็นค่าเริ่มต้นหรือไม่ // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we …

1
ทำไมคอมไพเลอร์ Rust ไม่ปรับโค้ดให้เหมาะสมโดยสมมติว่าการอ้างอิงที่ไม่แน่นอนทั้งสองไม่สามารถใช้นามแฝงได้
เท่าที่ฉันรู้การอ้างอิงนามแฝงตัวชี้ / สามารถขัดขวางความสามารถของคอมไพเลอร์ในการสร้างรหัสที่ดีที่สุดเพราะพวกเขาจะต้องตรวจสอบให้แน่ใจว่าการสร้างไบนารีทำงานอย่างถูกต้องในกรณีที่ทั้งสองอ้างอิง / พอยน์เตอร์นามแฝงแน่นอน ตัวอย่างเช่นในรหัส C ต่อไปนี้ void adds(int *a, int *b) { *a += *b; *a += *b; } เมื่อคอมไพล์clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)ด้วย-O3แฟล็ก 0000000000000000 <adds>: 0: 8b 07 mov (%rdi),%eax 2: 03 06 add (%rsi),%eax 4: 89 07 mov %eax,(%rdi) # The first time 6: 03 06 add …

2
เหตุใดจึงมีผลกระทบอย่างมากเมื่อวนลูปมากกว่าอาร์เรย์ที่มี 240 องค์ประกอบขึ้นไป
เมื่อเรียกใช้ลูปผลรวมเหนืออาร์เรย์ใน Rust ฉันสังเกตเห็นว่าประสิทธิภาพลดลงอย่างมากเมื่อCAPACITY> = 240. CAPACITY= 239 เร็วกว่าประมาณ 80 เท่า มีการเพิ่มประสิทธิภาพการรวบรวมพิเศษสนิมกำลังทำสำหรับอาร์เรย์ "สั้น"? rustc -C opt-level=3รวบรวมกับ use std::time::Instant; const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000; fn main() { let mut arr = [0; CAPACITY]; for i in 0..CAPACITY { arr[i] = i; } let mut sum = 0; …

4
จำนวนเต็ม 128 บิตของ Rust "i128" ทำงานอย่างไรบนระบบ 64 บิต
Rust มีจำนวนเต็ม 128 บิตซึ่งแสดงด้วยชนิดข้อมูลi128(และu128สำหรับ ints ที่ไม่ได้ลงชื่อ): let a: i128 = 170141183460469231731687303715884105727; Rust ทำให้i128ค่าเหล่านี้ทำงานบนระบบ 64 บิตได้อย่างไร เช่นมันคำนวณอย่างไรกับสิ่งเหล่านี้? เนื่องจากเท่าที่ฉันทราบค่านี้ไม่สามารถใส่ลงในรีจิสเตอร์ x86-64 ซีพียูได้คอมไพเลอร์ใช้ 2 รีจิสเตอร์สำหรับi128ค่าเดียวหรือไม่ หรือพวกเขาใช้โครงสร้างจำนวนเต็มใหญ่แทนแทน?

3
เหตุใด LLVM จึงจัดสรรตัวแปรซ้ำซ้อน
นี่คือไฟล์ C อย่างง่ายที่มีนิยาม enum และmainฟังก์ชั่น: enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } มัน transpiles เพื่อ LLVM IR ต่อไปนี้: define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca i32, align 4 store i32 0, …
9 c  llvm  llvm-codegen 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.