Skip to content

[LoongArch64] Miscompilation at -O2/O3 #159610

@XChy

Description

@XChy

Testcase:

target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "loongarch64-unknown-linux-musl"

@BS_CHECKSUM = global i64 0
@.str = constant [32 x i8] c"BackSmith Checksum = 0x%016llx\0A\00"

define i64 @func_14() {
entry:
  callbr void asm sideeffect "", "!i"()
          to label %asm.fallthrough [label %BS_LABEL_0]

asm.fallthrough:                                  ; preds = %entry
  br label %BS_LABEL_0

BS_LABEL_0:                                       ; preds = %BS_LABEL_0, %asm.fallthrough, %entry
  %l_1780.1 = phi i16 [ 0, %BS_LABEL_0 ], [ 0, %entry ], [ 1, %asm.fallthrough ]
  %p_16.addr.0 = phi i32 [ 0, %BS_LABEL_0 ], [ 1, %entry ], [ 0, %asm.fallthrough ]
  callbr void asm sideeffect "", "!i"()
          to label %asm.fallthrough66 [label %BS_LABEL_0]

asm.fallthrough66:                                ; preds = %BS_LABEL_0
  %0 = insertelement <4 x i32> zeroinitializer, i32 %p_16.addr.0, i64 0
  %vecinit5 = insertelement <4 x i32> %0, i32 %p_16.addr.0, i64 1
  %conv6 = zext <4 x i32> %vecinit5 to <4 x i64>
  %vecext = extractelement <4 x i64> %conv6, i64 0
  %tobool25.not = icmp eq i64 %vecext, 0
  %cond = select i1 %tobool25.not, i64 1, i64 -1
  %1 = insertelement <4 x i64> zeroinitializer, i64 %cond, i64 0
  %vecext29 = extractelement <4 x i64> %conv6, i64 1
  %tobool30.not = icmp eq i64 %vecext29, 0
  %cond35 = select i1 %tobool30.not, i64 1, i64 -1
  %vecinit61 = insertelement <4 x i64> %1, i64 %cond35, i64 1
  %vecext62 = extractelement <4 x i64> %vecinit61, i16 %l_1780.1
  store i64 %vecext62, ptr @BS_CHECKSUM, align 8
  ret i64 0
}

define i32 @main() {
entry:
  %call2 = call i64 @func_14()
  %0 = load i64, ptr @BS_CHECKSUM, align 8
  %call1 = call i32 (ptr, ...) @printf(ptr @.str, i64 %0)
  ret i32 0
}

Commands:

> clang --target=loongarch64-unknown-linux-musl --gcc-toolchain=/opt/loongarch64 --sysroot=/opt/loongarch64/loongarch64-unknown-linux-musl/sysroot -DARCH_LOONGARCH64 -static -O2 reduced.ll
> qemu-loongarch64 a.out
BackSmith Checksum = 0xffffffffffffffff
> clang --target=loongarch64-unknown-linux-musl --gcc-toolchain=/opt/loongarch64 --sysroot=/opt/loongarch64/loongarch64-unknown-linux-musl/sysroot -DARCH_LOONGARCH64 -static -O0 reduced.ll
> qemu-loongarch64 a.out
BackSmith Checksum = 0x0000000000000001

This testcase is run with llubi, and shows no UB. Let me know if you want unreduced C testcase.

Metadata

Metadata

Assignees

No one assigned

    Labels

    backend:loongarchquestionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions