Hi Jeff, Thanks for your comments. 在 2024/3/4 6:02, Jeff Law 写道: > Why specifically are you worried here? Propagation of a volatile shouldn't > in and of itself cause a problem. We're not changing the number of volatile > accesses or anything like that -- we're just moving them around a bit.
If the volatile asm operand is in a parallel set, it can't be eliminated after the propagation. So the define insn and use insn will execute the volatile asm block twice. That's the problem. Here is a real case from sanitizer_linux.cpp. The insn 62 has a volatile asm operands and it is propagated into insn 60. After propagation both insn 60 and 62 has the volatile asm operand. Thus asm block will be executed for twice. It causes sanitizer behaves abnormally in my test. propagating insn 62 into insn 60, replacing: (set (reg/v:DI 119 [ res ]) (reg:DI 133 [ res ])) successfully matched this instruction: (set (reg/v:DI 119 [ res ]) (asm_operands/v:DI ("mr 28, %5 mr 27, %8 mr 3, %7 mr 5, %9 mr 6, %10 mr 7, %11 li 0, %3 sc cmpdi cr1, 3, 0 crandc cr1*4+eq, cr1*4+eq, cr0*4+so bne- cr1, 1f li 29, 0 stdu 29, -8(1) stdu 1, -%12(1) std 2, %13(1) mr 12, 28 mtctr 12 mr 3, 27 bctrl ld 2, %13(1) li 0, %4 sc 1: mr %0, 3 ") ("=r") 0 [ (reg:SI 134) (const_int 22 [0x16]) (const_int 120 [0x78]) (const_int 1 [0x1]) (reg/v:DI 3 3 [ __fn ]) (reg/v:DI 4 4 [ __cstack ]) (reg/v:SI 5 5 [ __flags ]) (reg/v:DI 6 6 [ __arg ]) (reg/v:DI 7 7 [ __ptidptr ]) (reg/v:DI 8 8 [ __newtls ]) (reg/v:DI 9 9 [ __ctidptr ]) (const_int 32 [0x20]) (const_int 24 [0x18]) [ (asm_input:SI ("0") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) ] [] /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591)) rescanning insn with uid = 60. updating insn 60 in-place (insn 62 61 60 6 (parallel [ (set (reg:DI 133 [ res ]) (asm_operands/v:DI ("mr 28, %5 mr 27, %8 mr 3, %7 mr 5, %9 mr 6, %10 mr 7, %11 li 0, %3 sc cmpdi cr1, 3, 0 crandc cr1*4+eq, cr1*4+eq, cr0*4+so bne- cr1, 1f li 29, 0 stdu 29, -8(1) stdu 1, -%12(1) std 2, %13(1) mr 12, 28 mtctr 12 mr 3, 27 bctrl ld 2, %13(1) li 0, %4 sc 1: mr %0, 3 ") ("=r") 0 [ (reg:SI 134) (const_int 22 [0x16]) (const_int 120 [0x78]) (const_int 1 [0x1]) (reg/v:DI 3 3 [ __fn ]) (reg/v:DI 4 4 [ __cstack ]) (reg/v:SI 5 5 [ __flags ]) (reg/v:DI 6 6 [ __arg ]) (reg/v:DI 7 7 [ __ptidptr ]) (reg/v:DI 8 8 [ __newtls ]) (reg/v:DI 9 9 [ __ctidptr ]) (const_int 32 [0x20]) (const_int 24 [0x18]) ] [ (asm_input:SI ("0") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("i") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:SI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) (asm_input:DI ("r") /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591) ] [] /home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1591)) (clobber (reg:DI 29 29)) (clobber (reg:DI 28 28)) (clobber (reg:DI 27 27)) (clobber (reg:DI 0 0)) (clobber (reg:DI 97 ctr)) (clobber (mem:BLK (scratch) [0 A8])) (clobber (reg:CC 101 1)) (clobber (reg:CC 100 0)) (clobber (reg:SI 98 ca)) ]) "/home/guihaoc/gcc/gcc-mainline-base/libsanitizer/sanitizer_common/sanitizer_linux.cpp":1591:2 -1 (expr_list:REG_DEAD (reg:SI 134) (expr_list:REG_DEAD (reg/v:DI 9 9 [ __ctidptr ]) (expr_list:REG_DEAD (reg/v:DI 8 8 [ __newtls ]) (expr_list:REG_DEAD (reg/v:DI 7 7 [ __ptidptr ]) (expr_list:REG_DEAD (reg/v:DI 6 6 [ __arg ]) (expr_list:REG_DEAD (reg/v:SI 5 5 [ __flags ]) (expr_list:REG_DEAD (reg/v:DI 4 4 [ __cstack ]) (expr_list:REG_DEAD (reg/v:DI 3 3 [ __fn ]) (expr_list:REG_UNUSED (reg:CC 101 1) (expr_list:REG_UNUSED (reg:CC 100 0) (expr_list:REG_UNUSED (reg:SI 98 ca) (expr_list:REG_UNUSED (reg:DI 97 ctr) (expr_list:REG_UNUSED (reg:DI 29 29) (expr_list:REG_UNUSED (reg:DI 28 28) (expr_list:REG_UNUSED (reg:DI 27 27) (expr_list:REG_UNUSED (reg:DI 0 0) (nil)))))))))))))))))) Thanks Gui Haochen