Skip to content

Conversation

@badumbatish
Copy link
Contributor

@badumbatish badumbatish commented Aug 20, 2025

Related to #1817

@badumbatish
Copy link
Contributor Author

Input is

char* a(void *A, void *B, long x) {
  return __builtin_mempcpy(A, B, x);
}

CIR is

 ninja -C build && ./build/bin/clang --target=x86_64-unknown-linux  -S scratch/builtin_mempcpy.c  -o - -emit-llvm -g --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk  -emit-cir
ninja: Entering directory `build'
[126/126] Linking CXX shared library lib/libclang-cpp.dylib

module @"/Users/jjasmine/Developer/igalia/clangir/scratch/builtin_mempcpy.c" attributes {cir.lang = #cir.lang<c>, cir.sob = #cir.signed_overflow_behavior<undefined>, cir.triple = "x86_64-unknown-linux", cir.type_size_info = #cir.type_size_info<char = 8, int = 32, size_t = 64>, cir.uwtable = #cir.uwtable<async>, dlti.dl_spec = #dlti.dl_spec<!llvm.ptr<270> = dense<32> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, i64 = dense<64> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, f80 = dense<128> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, i1 = dense<8> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, f64 = dense<64> : vector<2xi64>, f128 = dense<128> : vector<2xi64>, "dlti.endianness" = "little", "dlti.mangling_mode" = "e", "dlti.legal_int_widths" = array<i32: 8, 16, 32, 64>, "dlti.stack_alignment" = 128 : i64>} {
  cir.func dso_local @a(%arg0: !cir.ptr<!void> loc(fused[#loc3, #loc4]), %arg1: !cir.ptr<!void> loc(fused[#loc5, #loc6]), %arg2: !s64i loc(fused[#loc7, #loc8])) -> !cir.ptr<!s8i> extra(#fn_attr) {
    %0 = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["A", init] {alignment = 8 : i64} loc(#loc17)
    %1 = cir.alloca !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>>, ["B", init] {alignment = 8 : i64} loc(#loc18)
    %2 = cir.alloca !s64i, !cir.ptr<!s64i>, ["x", init] {alignment = 8 : i64} loc(#loc19)
    %3 = cir.alloca !cir.ptr<!s8i>, !cir.ptr<!cir.ptr<!s8i>>, ["__retval"] {alignment = 8 : i64} loc(#loc2)
    cir.store %arg0, %0 : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>> loc(#loc9)
    cir.store %arg1, %1 : !cir.ptr<!void>, !cir.ptr<!cir.ptr<!void>> loc(#loc9)
    cir.store %arg2, %2 : !s64i, !cir.ptr<!s64i> loc(#loc9)
    %4 = cir.load align(8) %0 : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void> loc(#loc10)
    %5 = cir.load align(8) %1 : !cir.ptr<!cir.ptr<!void>>, !cir.ptr<!void> loc(#loc11)
    %6 = cir.load align(8) %2 : !cir.ptr<!s64i>, !s64i loc(#loc12)
    %7 = cir.cast(integral, %6 : !s64i), !u64i loc(#loc12)
    cir.libc.memcpy %7 bytes from %5 to %4 : !u64i, !cir.ptr<!void> -> !cir.ptr<!void> loc(#loc20)
    %8 = cir.cast(bitcast, %4 : !cir.ptr<!void>), !cir.ptr<!cir.ptr<!u8i>> loc(#loc10)
    %9 = cir.ptr_stride(%8 : !cir.ptr<!cir.ptr<!u8i>>, %7 : !u64i), !cir.ptr<!cir.ptr<!u8i>> loc(#loc20)
    %10 = cir.cast(bitcast, %9 : !cir.ptr<!cir.ptr<!u8i>>), !cir.ptr<!s8i> loc(#loc20)
    cir.store %10, %3 : !cir.ptr<!s8i>, !cir.ptr<!cir.ptr<!s8i>> loc(#loc21)
    %11 = cir.load %3 : !cir.ptr<!cir.ptr<!s8i>>, !cir.ptr<!s8i> loc(#loc21)
    cir.return %11 : !cir.ptr<!s8i> loc(#loc21)
  } loc(#loc16)
} loc(#loc)

LLVM clangir

 ninja -C build && ./build/bin/clang --target=x86_64-unknown-linux  -S scratch/builtin_mempcpy.c  -o - -emit-llvm -g --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.4.sdk -fclangir | ./build/bin/opt -S -passes=instcombine,mem2reg,simplifycfg -o -
ninja: Entering directory `build'
ninja: no work to do.

define dso_local ptr @a(ptr %0, ptr %1, i64 %2) #0 !dbg !4 {
  %4 = alloca ptr, i64 1, align 8, !dbg !8
  %5 = alloca ptr, i64 1, align 8, !dbg !8
  %6 = alloca i64, i64 1, align 8, !dbg !8
  %7 = alloca ptr, i64 1, align 8, !dbg !9
  store ptr %0, ptr %4, align 8, !dbg !10
  store ptr %1, ptr %5, align 8, !dbg !10
  store i64 %2, ptr %6, align 8, !dbg !10
  %8 = load ptr, ptr %4, align 8, !dbg !11
  %9 = load ptr, ptr %5, align 8, !dbg !12
  %10 = load i64, ptr %6, align 8, !dbg !13
  call void @llvm.memcpy.p0.p0.i64(ptr %8, ptr %9, i64 %10, i1 false), !dbg !14
  %11 = getelementptr ptr, ptr %8, i64 %10, !dbg !14
  store ptr %11, ptr %7, align 8, !dbg !14
  %12 = load ptr, ptr %7, align 8, !dbg !14
  ret ptr %12, !dbg !14
}

LLVM clang

define dso_local ptr @a(ptr noundef %A, ptr noundef %B, i64 noundef %x) #0 !dbg !10 {
entry:
  %A.addr = alloca ptr, align 8
  %B.addr = alloca ptr, align 8
  %x.addr = alloca i64, align 8
  store ptr %A, ptr %A.addr, align 8
    #dbg_declare(ptr %A.addr, !18, !DIExpression(), !19)
  store ptr %B, ptr %B.addr, align 8
    #dbg_declare(ptr %B.addr, !20, !DIExpression(), !21)
  store i64 %x, ptr %x.addr, align 8
    #dbg_declare(ptr %x.addr, !22, !DIExpression(), !23)
  %0 = load ptr, ptr %A.addr, align 8, !dbg !24
  %1 = load ptr, ptr %B.addr, align 8, !dbg !25
  %2 = load i64, ptr %x.addr, align 8, !dbg !26
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %0, ptr align 1 %1, i64 %2, i1 false), !dbg !27
  %3 = getelementptr inbounds i8, ptr %0, i64 %2, !dbg !27
  ret ptr %3, !dbg !28
}

Copy link
Member

@bcardosolopes bcardosolopes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mostly good, few nits and should be ready!

Copy link
Member

@bcardosolopes bcardosolopes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome, LGTM

@bcardosolopes bcardosolopes merged commit bec5b92 into llvm:main Aug 22, 2025
8 of 9 checks passed
bcardosolopes pushed a commit that referenced this pull request Sep 9, 2025
From the
[comment](#1844 (comment))
on PR review #1844, it seems like we're missing the flags for GEP.

I'm opening the PR to add the flags.

The first commit is just a prototype to gather opinions and reviews to
see if I'm heading to the right direction with this.
@badumbatish badumbatish deleted the mempcpy branch September 29, 2025 01:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants