In the following example, printf() is converted to puts(). What are the options to turn off any possible optimization during compilation and just let gcc literally translate the C code to the assembly code? Note that clang does not perform such an optimization. Should gcc do the same to turn off any optimization by default? Thanks. $ gcc -S -x c -o - - <<< '#include <stdio.h>'$'\n''int main() { puts("Hello World1!"); printf("Hello World2!\n"); }' .file "" .text .section .rodata .LC0: .string "Hello World1!" .LC1: .string "Hello World2!" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 leaq .LC0(%rip), %rdi call puts@PLT leaq .LC1(%rip), %rdi call puts@PLT movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Debian 10.2.1-6) 10.2.1 20210110" .section .note.GNU-stack,"",@progbits $ clang -S -x c -o - - <<< '#include <stdio.h>'$'\n''int main() { puts("Hello World1!"); printf("Hello World2!\n"); }' .text .file "-" .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main: # @main .cfi_startproc # %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp subq $16, %rsp movabsq $.L.str, %rdi callq puts movabsq $.L.str.1, %rdi movl %eax, -4(%rbp) # 4-byte Spill movb $0, %al callq printf xorl %ecx, %ecx movl %eax, -8(%rbp) # 4-byte Spill movl %ecx, %eax addq $16, %rsp popq %rbp .cfi_def_cfa %rsp, 8 retq .Lfunc_end0: .size main, .Lfunc_end0-main .cfi_endproc # -- End function .type .L.str,@object # @.str .section .rodata.str1.1,"aMS",@progbits,1 .L.str: .asciz "Hello World1!" .size .L.str, 14 .type .L.str.1,@object # @.str.1 .L.str.1: .asciz "Hello World2!\n" .size .L.str.1, 15 .ident "Debian clang version 11.0.1-2" .section ".note.GNU-stack","",@progbits .addrsig .addrsig_sym puts .addrsig_sym printf -- Regards, Peng