Skip to content

Instantly share code, notes, and snippets.

@chapuni
Created March 11, 2014 10:00
Show Gist options
  • Save chapuni/9482736 to your computer and use it in GitHub Desktop.
Save chapuni/9482736 to your computer and use it in GitHub Desktop.
Clang :: CodeGen/builtins-arm-exclusive.c
; ModuleID = '/home/chapuni/llvm-project/clang/test/CodeGen/builtins-arm-exclusive.c'
target datalayout = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv7--linux-gnueabi"
%struct.Simple = type { i8, i8 }
; Function Attrs: nounwind
define i32 @atomic_inc(i32* %addr) #0 {
br label %1
; <label>:1 ; preds = %1, %0
%2 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %addr)
%3 = add nsw i32 %2, 1
%4 = tail call i32 @llvm.arm.strex.p0i32(i32 %3, i32* %addr)
%5 = icmp eq i32 %4, 0
br i1 %5, label %6, label %1
; <label>:6 ; preds = %1
ret i32 %2
}
; Function Attrs: nounwind
declare i32 @llvm.arm.ldrex.p0i32(i32*) #1
; Function Attrs: nounwind
declare i32 @llvm.arm.strex.p0i32(i32, i32*) #1
; Function Attrs: nounwind
define i32 @test_ldrex(i8* %addr, i64* %addr64, float* %addrfloat) #0 {
%1 = tail call i32 @llvm.arm.ldrex.p0i8(i8* %addr)
%2 = and i32 %1, 255
%3 = bitcast i8* %addr to i16*
%4 = tail call i32 @llvm.arm.ldrex.p0i16(i16* %3)
%sext = shl i32 %4, 16
%5 = ashr exact i32 %sext, 16
%6 = bitcast i8* %addr to i32*
%7 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6)
%8 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %addr)
%9 = extractvalue { i32, i32 } %8, 0
%10 = bitcast i64* %addr64 to i8*
%11 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %10)
%12 = extractvalue { i32, i32 } %11, 0
%13 = add i32 %7, %2
%14 = add i32 %13, %5
%15 = add i32 %14, %9
%16 = add i32 %15, %12
%17 = bitcast float* %addrfloat to i32*
%18 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %17)
%19 = bitcast i32 %18 to float
%20 = sitofp i32 %16 to float
%21 = fadd float %19, %20
%22 = fptosi float %21 to i32
%23 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %addr)
%24 = extractvalue { i32, i32 } %23, 1
%25 = zext i32 %24 to i64
%26 = shl nuw i64 %25, 32
%27 = or i64 %26, %25
%28 = bitcast i64 %27 to double
%29 = sitofp i32 %22 to double
%30 = fadd double %29, %28
%31 = fptosi double %30 to i32
%32 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6)
%33 = inttoptr i32 %32 to i32*
%34 = load i32* %33, align 4, !tbaa !1
%35 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6)
%36 = inttoptr i32 %35 to %struct.Simple*
%37 = getelementptr inbounds %struct.Simple* %36, i32 0, i32 0
%38 = load i8* %37, align 1, !tbaa !5
%39 = zext i8 %38 to i32
%40 = add i32 %39, %34
%41 = add i32 %40, %31
ret i32 %41
}
; Function Attrs: nounwind
declare i32 @llvm.arm.ldrex.p0i8(i8*) #1
; Function Attrs: nounwind
declare i32 @llvm.arm.ldrex.p0i16(i16*) #1
; Function Attrs: nounwind
declare { i32, i32 } @llvm.arm.ldrexd(i8*) #1
; Function Attrs: nounwind
define i32 @test_strex(i8* %addr) #0 {
%var = alloca i16, align 4
store i16 0, i16* %var, align 4
%1 = call i32 @llvm.arm.strex.p0i8(i32 4, i8* %addr)
%2 = bitcast i8* %addr to i16*
%3 = call i32 @llvm.arm.strex.p0i16(i32 42, i16* %2)
%4 = or i32 %3, %1
%5 = bitcast i8* %addr to i32*
%6 = call i32 @llvm.arm.strex.p0i32(i32 42, i32* %5)
%7 = or i32 %4, %6
%8 = call i32 @llvm.arm.strexd(i32 42, i32 0, i8* %addr)
%9 = or i32 %7, %8
%10 = call i32 @llvm.arm.strex.p0i32(i32 1076754509, i32* %5)
%11 = or i32 %9, %10
%12 = call i32 @llvm.arm.strexd(i32 -266631570, i32 1074340345, i8* %addr)
%13 = or i32 %11, %12
%14 = ptrtoint i16* %var to i32
%15 = call i32 @llvm.arm.strex.p0i32(i32 %14, i32* %5)
%16 = or i32 %13, %15
ret i32 %16
}
; Function Attrs: nounwind
declare i32 @llvm.arm.strex.p0i8(i32, i8*) #1
; Function Attrs: nounwind
declare i32 @llvm.arm.strex.p0i16(i32, i16*) #1
; Function Attrs: nounwind
declare i32 @llvm.arm.strexd(i32, i32, i8*) #1
; Function Attrs: nounwind
define void @test_clrex() #0 {
tail call void @llvm.arm.clrex()
ret void
}
; Function Attrs: nounwind
declare void @llvm.arm.clrex() #1
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"clang version 3.5.0 "}
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}
!5 = metadata !{metadata !6, metadata !3, i64 0}
!6 = metadata !{metadata !"Simple", metadata !3, i64 0, metadata !3, i64 1}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment