Compiler projects using llvm
; RUN: llvm-as < %s | llvm-dis | FileCheck %s

declare void @callee0()
declare void @callee1(i32,i32)

define void @f0(i32* %ptr) {
; CHECK-LABEL: @f0(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ]
; CHECK: call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ]
  ret void
}

define void @f1(i32* %ptr) {
; CHECK-LABEL: @f1(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1

  call void @callee0()
  call void @callee0() [ "foo"() ]
  call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ]
; CHECK: @callee0(){{$}}
; CHECK-NEXT: call void @callee0() [ "foo"() ]
; CHECK-NEXT: call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ]
  ret void
}

define void @f2(i32* %ptr) {
; CHECK-LABEL: @f2(
 entry:
  call void @callee0() [ "foo"() ]
; CHECK: call void @callee0() [ "foo"() ]
  ret void
}

define void @f3(i32* %ptr) {
; CHECK-LABEL: @f3(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]
; CHECK: call void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]
  ret void
}

define void @f4(i32* %ptr) {
; CHECK-LABEL: @f4(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  call void @callee1(i32 10, i32 %x) [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]
; CHECK: call void @callee1(i32 10, i32 %x) [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]
  ret void
}

; Invoke versions of the above tests:


define void @g0(i32* %ptr) personality i8 3 {
; CHECK-LABEL: @g0(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ] to label %normal unwind label %exception
; CHECK: invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "bar"(float  0.000000e+00, i64 100, i32 %l) ]

exception:
  %cleanup = landingpad i8 cleanup
  br label %normal
normal:
  ret void
}

define void @g1(i32* %ptr) personality i8 3 {
; CHECK-LABEL: @g1(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1

  invoke void @callee0() to label %normal unwind label %exception
; CHECK: invoke void @callee0(){{$}}

exception:
  %cleanup = landingpad i8 cleanup
  br label %normal

normal:
  invoke void @callee0() [ "foo"() ] to label %normal1 unwind label %exception1
; CHECK: invoke void @callee0() [ "foo"() ]

exception1:
  %cleanup1 = landingpad i8 cleanup
  br label %normal1

normal1:
  invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ] to label %normal2 unwind label %exception2
; CHECK: invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]

exception2:
  %cleanup2 = landingpad i8 cleanup
  br label %normal2

normal2:
  ret void
}

define void @g2(i32* %ptr) personality i8 3 {
; CHECK-LABEL: @g2(
 entry:
  invoke void @callee0() [ "foo"() ] to label %normal unwind label %exception
; CHECK: invoke void @callee0() [ "foo"() ]

exception:
  %cleanup = landingpad i8 cleanup
  br label %normal
normal:
  ret void
}

define void @g3(i32* %ptr) personality i8 3 {
; CHECK-LABEL: @g3(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ] to label %normal unwind label %exception
; CHECK: invoke void @callee0() [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]

exception:
  %cleanup = landingpad i8 cleanup
  br label %normal
normal:
  ret void
}

define void @g4(i32* %ptr) personality i8 3 {
; CHECK-LABEL: @g4(
 entry:
  %l = load i32, i32* %ptr
  %x = add i32 42, 1
  invoke void @callee1(i32 10, i32 %x) [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]
        to label %normal unwind label %exception
; CHECK: invoke void @callee1(i32 10, i32 %x) [ "foo"(i32 42, i64 100, i32 %x), "foo"(i32 42, float  0.000000e+00, i32 %l) ]

exception:
  %cleanup = landingpad i8 cleanup
  br label %normal
normal:
  ret void
}