https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100449
Bug ID: 100449 Summary: Unrolled loop ignores __building_constant_p Product: gcc Version: 10.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: christophe.leroy at csgroup dot eu Target Milestone: --- The following code built with -m32 -O2 -c : static inline void mtsr(unsigned long val, unsigned long idx) { if (__builtin_constant_p(idx)) asm volatile("mtsr %1, %0" : : "r" (val), "i" (idx >> 28)); else asm volatile("mtsrin %0, %1" : : "r" (val), "r" (idx)); } void update_user_segments(unsigned long val) { int i; for (i = 0; i < 4; i++) mtsr(val + 0x111 * i, i << 28); } Results in: 00000000 <update_user_segments>: 0: 39 20 00 00 li r9,0 4: 7c 60 49 e4 mtsrin r3,r9 8: 3d 40 10 00 lis r10,4096 c: 39 23 01 11 addi r9,r3,273 10: 7d 20 51 e4 mtsrin r9,r10 14: 3d 40 20 00 lis r10,8192 18: 39 23 02 22 addi r9,r3,546 1c: 7d 20 51 e4 mtsrin r9,r10 20: 3d 20 30 00 lis r9,12288 24: 38 63 03 33 addi r3,r3,819 28: 7c 60 49 e4 mtsrin r3,r9 2c: 4e 80 00 20 blr I would expect GCC to realise that once unrolled, parameters to mtsr() are constant, leading to something like the following: mtsr 0, r3 addi r9,r3,273 mtsr 1, r9 addi r9,r3,546 mtsr 2, r9 addi r3,r3,819 mtsr 3, r3 blr