Skip to content

[clang][LoongArch] Too many instructions are generated for const-string copy with -mstrict-align #101295

Closed
@heiher

Description

@heiher

Command line options:

clang -target loongarch64 -O3 -S -o - align.c -mstrict-align

Minimal reproduction:

#include <stdio.h>

extern void outs(char *str);

void test(void)
{
    char msgbuf[64];
    sprintf(msgbuf, "preemption imbalance ");
    outs(msgbuf);
}

LoongArch machine code (clang 20.0.0git):

	.text
	.file	"align.c"
	.globl	test                            # -- Begin function test
	.p2align	5
	.type	test,@function
test:                                   # @test
# %bb.0:                                # %entry
	addi.d	$sp, $sp, -80
	st.d	$ra, $sp, 72                    # 8-byte Folded Spill
	pcalau12i	$a0, %pc_hi20(.L.str)
	addi.d	$a0, $a0, %pc_lo12(.L.str)
	ld.b	$a1, $a0, 21
	ld.bu	$a2, $a0, 20
	slli.d	$a1, $a1, 8
	or	$a1, $a1, $a2
	st.h	$a1, $sp, 28
	ld.bu	$a1, $a0, 17
	ld.bu	$a2, $a0, 16
	ld.bu	$a3, $a0, 18
	ld.b	$a4, $a0, 19
	slli.d	$a1, $a1, 8
	or	$a1, $a1, $a2
	slli.d	$a2, $a3, 16
	slli.d	$a3, $a4, 24
	or	$a2, $a3, $a2
	or	$a1, $a2, $a1
	st.w	$a1, $sp, 24
	ld.bu	$a1, $a0, 9
	ld.bu	$a2, $a0, 8
	ld.bu	$a3, $a0, 10
	ld.bu	$a4, $a0, 11
	slli.d	$a1, $a1, 8
	or	$a1, $a1, $a2
	slli.d	$a2, $a3, 16
	slli.d	$a3, $a4, 24
	or	$a2, $a3, $a2
	or	$a1, $a2, $a1
	ld.bu	$a2, $a0, 13
	ld.bu	$a3, $a0, 12
	ld.bu	$a4, $a0, 14
	ld.bu	$a5, $a0, 15
	slli.d	$a2, $a2, 8
	or	$a2, $a2, $a3
	slli.d	$a3, $a4, 16
	slli.d	$a4, $a5, 24
	or	$a3, $a4, $a3
	or	$a2, $a3, $a2
	slli.d	$a2, $a2, 32
	or	$a1, $a2, $a1
	st.d	$a1, $sp, 16
	ld.bu	$a1, $a0, 1
	ld.bu	$a2, $a0, 0
	ld.bu	$a3, $a0, 2
	ld.bu	$a4, $a0, 3
	slli.d	$a1, $a1, 8
	or	$a1, $a1, $a2
	slli.d	$a2, $a3, 16
	slli.d	$a3, $a4, 24
	or	$a2, $a3, $a2
	or	$a1, $a2, $a1
	ld.bu	$a2, $a0, 5
	ld.bu	$a3, $a0, 4
	ld.bu	$a4, $a0, 6
	ld.bu	$a0, $a0, 7
	slli.d	$a2, $a2, 8
	or	$a2, $a2, $a3
	slli.d	$a3, $a4, 16
	slli.d	$a0, $a0, 24
	or	$a0, $a0, $a3
	or	$a0, $a0, $a2
	slli.d	$a0, $a0, 32
	or	$a0, $a0, $a1
	st.d	$a0, $sp, 8
	addi.d	$a0, $sp, 8
	bl	%plt(outs)
	ld.d	$ra, $sp, 72                    # 8-byte Folded Reload
	addi.d	$sp, $sp, 80
	ret
.Lfunc_end0:
	.size	test, .Lfunc_end0-test
                                        # -- End function
	.type	.L.str,@object                  # @.str
	.section	.rodata.str1.1,"aMS",@progbits,1
.L.str:
	.asciz	"preemption imbalance "
	.size	.L.str, 22

	.ident	"clang version 20.0.0git (https://github.com/llvm/llvm-project 84ad292f343e0b0b821fc18447a20c59530f9ec7)"
	.section	".note.GNU-stack","",@progbits
	.addrsig

LoongArch machine code (gcc 14.1.0):

	.file	"align.c"
	.text
	.section	.rodata.str1.8,"aMS",@progbits,1
	.align	3
.LC0:
	.ascii	"preemption imbalance \000"
	.text
	.align	2
	.align	3
	.globl	test
	.type	test, @function
test:
.LFB0 = .
	.cfi_startproc
	la.local	$r12,.LC0
	ldptr.d	$r15,$r12,0
	ld.d	$r14,$r12,8
	ldptr.w	$r13,$r12,16
	ld.hu	$r12,$r12,20
	addi.d	$r3,$r3,-80
	.cfi_def_cfa_offset 80
	or	$r4,$r3,$r0
	st.d	$r1,$r3,72
	.cfi_offset 1, -8
	stptr.d	$r15,$r3,0
	st.d	$r14,$r3,8
	st.w	$r13,$r3,16
	st.h	$r12,$r3,20
	bl	%plt(outs)
	ld.d	$r1,$r3,72
	.cfi_restore 1
	addi.d	$r3,$r3,80
	.cfi_def_cfa_offset 0
	jr	$r1
	.cfi_endproc
.LFE0:
	.size	test, .-test


	.ident	"GCC: (crosstool-NG UNKNOWN) 14.1.0"
	.section	.note.GNU-stack,"",@progbits

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions