Compiler projects using llvm
; RUN: llc -relocation-model=pic -march=mipsel -mcpu=mips64r6 \
; RUN:     -disable-mips-delay-filler -target-abi=n64 < %s | FileCheck %s

; Function Attrs: nounwind
define void @l() {
entry:
; CHECK-LABEL:  l:
; CHECK: jalrc $25
  %call = tail call i64 @k()
; CHECK: jalrc $25
  %call1 = tail call i64 @j()
  %cmp = icmp eq i64 %call, %call1
; CHECK: bnec
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext -2)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc  $ra
  ret void
}

declare i64 @k()

declare i64 @j()

declare void @f(i64 signext)

; Function Attrs: define void @l2() {
define void @l2() {
entry:
; CHECK-LABEL: l2:
; CHECK: jalrc $25
  %call = tail call i64 @k()
; CHECK: jalrc $25
  %call1 = tail call i64 @i()
  %cmp = icmp eq i64 %call, %call1
; CHECK: beqc
  br i1 %cmp, label %if.end, label %if.then

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext -1)
  br label %if.end

if.end:                                           ; preds = %entry, %if.then
; CHECK: jrc  $ra
  ret void
}

declare i64 @i()

; Function Attrs: nounwind
define void @l3() {
entry:
; CHECK-LABEL: l3:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp slt i64 %call, 0
; CHECK: bgez
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext 0)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc $ra
  ret void
}

; Function Attrs: nounwind
define void @l4() {
entry:
; CHECK-LABEL: l4:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp slt i64 %call, 1
; CHECK: bgtzc
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
  tail call void @f(i64 signext 1)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc $ra
  ret void
}

; Function Attrs: nounwind
define void @l5() {
entry:
; CHECK-LABEL: l5:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp sgt i64 %call, 0
; CHECK: blezc
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext 2)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc  $ra
  ret void
}

; Function Attrs: nounwind
define void @l6() {
entry:
; CHECK-LABEL: l6:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp sgt i64 %call, -1
; CHECK: bltzc
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext 3)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc $ra
  ret void
}

; Function Attrs: nounwind
define void @l7() {
entry:
; CHECK-LABEL: l7:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp eq i64 %call, 0
; CHECK: bnezc
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext 4)
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc  $ra
  ret void
}

; Function Attrs: nounwind
define void @l8() {
entry:
; CHECK-LABEL: l8:
; CHECK: jalrc $25
  %call = tail call i64 @k()
  %cmp = icmp eq i64 %call, 0
; CHECK: beqzc
  br i1 %cmp, label %if.end, label %if.then

if.then:                                          ; preds = %entry:
; CHECK: jalrc $25
  tail call void @f(i64 signext 5)
  br label %if.end

if.end:                                           ; preds = %entry, %if.then
; CHECK: jrc  $ra
  ret void
}

define i64 @l9(i8* ()* %i) {
entry:
; CHECK-LABEL: l9:
  %i.addr = alloca i8* ()*, align 4
  store i8* ()* %i, i8* ()** %i.addr, align 4
; CHECK: jalrc $25
  %call = call i64 @k()
  %cmp = icmp ne i64 %call, 0
; CHECK: beqzc
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry
  %0 = load i8* ()*, i8* ()** %i.addr, align 4
; CHECK: jalrc $25
  %call1 = call i8* %0()
  br label %if.end

if.end:                                           ; preds = %if.then, %entry
; CHECK: jrc $ra
  ret i64 -1
}