Compiler projects using llvm
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | FileCheck %s
; RUN: %if ptxas %{ llc < %s -march=nvptx -mcpu=sm_20 -verify-machineinstrs | %ptxas-verify %}


declare i32 @llvm.nvvm.read.ptx.sreg.envreg0()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg1()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg2()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg3()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg4()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg5()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg6()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg7()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg8()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg9()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg10()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg11()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg12()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg13()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg14()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg15()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg16()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg17()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg18()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg19()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg20()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg21()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg22()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg23()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg24()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg25()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg26()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg27()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg28()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg29()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg30()
declare i32 @llvm.nvvm.read.ptx.sreg.envreg31()


; CHECK: foo
define i32 @foo() {
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg0
  %val0 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg0()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg1
  %val1 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg1()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg2
  %val2 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg2()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg3
  %val3 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg3()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg4
  %val4 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg4()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg5
  %val5 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg5()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg6
  %val6 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg6()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg7
  %val7 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg7()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg8
  %val8 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg8()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg9
  %val9 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg9()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg10
  %val10 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg10()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg11
  %val11 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg11()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg12
  %val12 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg12()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg13
  %val13 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg13()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg14
  %val14 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg14()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg15
  %val15 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg15()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg16
  %val16 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg16()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg17
  %val17 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg17()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg18
  %val18 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg18()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg19
  %val19 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg19()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg20
  %val20 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg20()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg21
  %val21 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg21()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg22
  %val22 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg22()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg23
  %val23 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg23()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg24
  %val24 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg24()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg25
  %val25 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg25()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg26
  %val26 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg26()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg27
  %val27 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg27()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg28
  %val28 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg28()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg29
  %val29 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg29()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg30
  %val30 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg30()
; CHECK: mov.b32 %r{{[0-9]+}}, %envreg31
  %val31 = tail call i32 @llvm.nvvm.read.ptx.sreg.envreg31()


  %ret0 = add i32 %val0, %val1
  %ret1 = add i32 %ret0, %val2
  %ret2 = add i32 %ret1, %val3
  %ret3 = add i32 %ret2, %val4
  %ret4 = add i32 %ret3, %val5
  %ret5 = add i32 %ret4, %val6
  %ret6 = add i32 %ret5, %val7
  %ret7 = add i32 %ret6, %val8
  %ret8 = add i32 %ret7, %val9
  %ret9 = add i32 %ret8, %val10
  %ret10 = add i32 %ret9, %val11
  %ret11 = add i32 %ret10, %val12
  %ret12 = add i32 %ret11, %val13
  %ret13 = add i32 %ret12, %val14
  %ret14 = add i32 %ret13, %val15
  %ret15 = add i32 %ret14, %val16
  %ret16 = add i32 %ret15, %val17
  %ret17 = add i32 %ret16, %val18
  %ret18 = add i32 %ret17, %val19
  %ret19 = add i32 %ret18, %val20
  %ret20 = add i32 %ret19, %val21
  %ret21 = add i32 %ret20, %val22
  %ret22 = add i32 %ret21, %val23
  %ret23 = add i32 %ret22, %val24
  %ret24 = add i32 %ret23, %val25
  %ret25 = add i32 %ret24, %val26
  %ret26 = add i32 %ret25, %val27
  %ret27 = add i32 %ret26, %val28
  %ret28 = add i32 %ret27, %val29
  %ret29 = add i32 %ret28, %val30
  %ret30 = add i32 %ret29, %val31

  ret i32 %ret30
}