Home | History | Annotate | Download | only in Assembler
      1 ; Test to make sure intrinsics are automatically upgraded.
      2 ; RUN: llvm-as < %s | llvm-dis | FileCheck %s
      3 ; RUN: verify-uselistorder %s
      4 
      5 declare i8 @llvm.ctlz.i8(i8)
      6 declare i16 @llvm.ctlz.i16(i16)
      7 declare i32 @llvm.ctlz.i32(i32)
      8 declare i42 @llvm.ctlz.i42(i42)  ; Not a power-of-2
      9 
     10 
     11 declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
     12 
     13 
     14 define void @test.ctlz(i8 %a, i16 %b, i32 %c, i42 %d) {
     15 ; CHECK: @test.ctlz
     16 
     17 entry:
     18   ; CHECK: call i8 @llvm.ctlz.i8(i8 %a, i1 false)
     19   call i8 @llvm.ctlz.i8(i8 %a)
     20   ; CHECK: call i16 @llvm.ctlz.i16(i16 %b, i1 false)
     21   call i16 @llvm.ctlz.i16(i16 %b)
     22   ; CHECK: call i32 @llvm.ctlz.i32(i32 %c, i1 false)
     23   call i32 @llvm.ctlz.i32(i32 %c)
     24   ; CHECK: call i42 @llvm.ctlz.i42(i42 %d, i1 false)
     25   call i42 @llvm.ctlz.i42(i42 %d)
     26 
     27   ret void
     28 }
     29 
     30 declare i8 @llvm.cttz.i8(i8)
     31 declare i16 @llvm.cttz.i16(i16)
     32 declare i32 @llvm.cttz.i32(i32)
     33 declare i42 @llvm.cttz.i42(i42)  ; Not a power-of-2
     34 
     35 define void @test.cttz(i8 %a, i16 %b, i32 %c, i42 %d) {
     36 ; CHECK: @test.cttz
     37 
     38 entry:
     39   ; CHECK: call i8 @llvm.cttz.i8(i8 %a, i1 false)
     40   call i8 @llvm.cttz.i8(i8 %a)
     41   ; CHECK: call i16 @llvm.cttz.i16(i16 %b, i1 false)
     42   call i16 @llvm.cttz.i16(i16 %b)
     43   ; CHECK: call i32 @llvm.cttz.i32(i32 %c, i1 false)
     44   call i32 @llvm.cttz.i32(i32 %c)
     45   ; CHECK: call i42 @llvm.cttz.i42(i42 %d, i1 false)
     46   call i42 @llvm.cttz.i42(i42 %d)
     47 
     48   ret void
     49 }
     50 
     51 
     52 @a = private global [60 x i8] zeroinitializer, align 1
     53 
     54 define i32 @test.objectsize() {
     55 ; CHECK-LABEL: @test.objectsize(
     56 ; CHECK: @llvm.objectsize.i32.p0i8(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i1 false, i1 false)
     57   %s = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i1 false)
     58   ret i32 %s
     59 }
     60 
     61 declare i64 @llvm.objectsize.i64.p0i8(i8*, i1) nounwind readonly
     62 define i64 @test.objectsize.2() {
     63 ; CHECK-LABEL: @test.objectsize.2(
     64 ; CHECK: @llvm.objectsize.i64.p0i8(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i1 false, i1 false)
     65   %s = call i64 @llvm.objectsize.i64.p0i8(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i1 false)
     66   ret i64 %s
     67 }
     68 
     69 
     70 declare <2 x double> @llvm.masked.load.v2f64(<2 x double>* %ptrs, i32, <2 x i1> %mask, <2 x double> %src0)
     71 
     72 define <2 x double> @tests.masked.load(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %passthru)  {
     73 ; CHECK-LABEL: @tests.masked.load(
     74 ; CHECK: @llvm.masked.load.v2f64.p0v2f64
     75   %res = call <2 x double> @llvm.masked.load.v2f64(<2 x double>* %ptr, i32 1, <2 x i1> %mask, <2 x double> %passthru)
     76   ret <2 x double> %res
     77 }
     78 
     79 declare void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptrs, i32, <2 x i1> %mask)
     80 
     81 define void @tests.masked.store(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %val)  {
     82 ; CHECK-LABEL: @tests.masked.store(
     83 ; CHECK: @llvm.masked.store.v2f64.p0v2f64
     84   call void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptr, i32 3, <2 x i1> %mask)
     85   ret void
     86 }
     87 
     88 declare <2 x double> @llvm.masked.gather.v2f64(<2 x double*> %ptrs, i32, <2 x i1> %mask, <2 x double> %src0)
     89 
     90 define <2 x double> @tests.masked.gather(<2 x double*> %ptr, <2 x i1> %mask, <2 x double> %passthru)  {
     91 ; CHECK-LABEL: @tests.masked.gather(
     92 ; CHECK: @llvm.masked.gather.v2f64.v2p0f64
     93   %res = call <2 x double> @llvm.masked.gather.v2f64(<2 x double*> %ptr, i32 1, <2 x i1> %mask, <2 x double> %passthru)
     94   ret <2 x double> %res
     95 }
     96 
     97 declare void @llvm.masked.scatter.v2f64(<2 x double> %val, <2 x double*> %ptrs, i32, <2 x i1> %mask)
     98 
     99 define void @tests.masked.scatter(<2 x double*> %ptr, <2 x i1> %mask, <2 x double> %val)  {
    100 ; CHECK-LABEL: @tests.masked.scatter(
    101 ; CHECK: @llvm.masked.scatter.v2f64.v2p0f64
    102   call void @llvm.masked.scatter.v2f64(<2 x double> %val, <2 x double*> %ptr, i32 3, <2 x i1> %mask)
    103   ret void
    104 }
    105 
    106 declare {}* @llvm.invariant.start(i64, i8* nocapture) nounwind readonly
    107 declare void @llvm.invariant.end({}*, i64, i8* nocapture) nounwind
    108 
    109 define void @tests.invariant.start.end() {
    110   ; CHECK-LABEL: @tests.invariant.start.end(
    111   %a = alloca i8
    112   %i = call {}* @llvm.invariant.start(i64 1, i8* %a)
    113   ; CHECK: call {}* @llvm.invariant.start.p0i8
    114   store i8 0, i8* %a
    115   call void @llvm.invariant.end({}* %i, i64 1, i8* %a)
    116   ; CHECK: call void @llvm.invariant.end.p0i8
    117   ret void
    118 }
    119 
    120 @__stack_chk_guard = external global i8*
    121 declare void @llvm.stackprotectorcheck(i8**)
    122 
    123 define void @test.stackprotectorcheck() {
    124 ; CHECK-LABEL: @test.stackprotectorcheck(
    125 ; CHECK-NEXT: ret void
    126   call void @llvm.stackprotectorcheck(i8** @__stack_chk_guard)
    127   ret void
    128 }
    129 
    130 declare void  @llvm.lifetime.start(i64, i8* nocapture) nounwind readonly
    131 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
    132 
    133 define void @tests.lifetime.start.end() {
    134   ; CHECK-LABEL: @tests.lifetime.start.end(
    135   %a = alloca i8
    136   call void @llvm.lifetime.start(i64 1, i8* %a)
    137   ; CHECK: call void @llvm.lifetime.start.p0i8(i64 1, i8* %a)
    138   store i8 0, i8* %a
    139   call void @llvm.lifetime.end(i64 1, i8* %a)
    140   ; CHECK: call void @llvm.lifetime.end.p0i8(i64 1, i8* %a)
    141   ret void
    142 }
    143 
    144 
    145 ; This is part of @test.objectsize(), since llvm.objectsize declaration gets
    146 ; emitted at the end.
    147 ; CHECK: declare i32 @llvm.objectsize.i32.p0i8
    148 
    149 
    150 ; CHECK: declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
    151 ; CHECK: declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
    152