diff options
Diffstat (limited to 'test/Assembler')
-rw-r--r-- | test/Assembler/2008-09-02-FunctionNotes.ll | 9 | ||||
-rw-r--r-- | test/Assembler/2010-02-05-FunctionLocalMetadataBecomesNull.ll | 9 | ||||
-rw-r--r-- | test/Assembler/ConstantExprNoFold.ll | 23 | ||||
-rw-r--r-- | test/Assembler/externally-initialized.ll | 5 | ||||
-rw-r--r-- | test/Assembler/fast-math-flags.ll | 142 | ||||
-rw-r--r-- | test/Assembler/getelementptr.ll | 19 | ||||
-rw-r--r-- | test/Assembler/getelementptr_vec_idx1.ll | 10 | ||||
-rw-r--r-- | test/Assembler/getelementptr_vec_idx2.ll | 10 | ||||
-rw-r--r-- | test/Assembler/getelementptr_vec_idx3.ll | 10 | ||||
-rw-r--r-- | test/Assembler/getelementptr_vec_struct.ll | 10 | ||||
-rw-r--r-- | test/Assembler/unnamed-addr.ll | 4 |
11 files changed, 246 insertions, 5 deletions
diff --git a/test/Assembler/2008-09-02-FunctionNotes.ll b/test/Assembler/2008-09-02-FunctionNotes.ll index 761c91e..11a0411 100644 --- a/test/Assembler/2008-09-02-FunctionNotes.ll +++ b/test/Assembler/2008-09-02-FunctionNotes.ll @@ -1,14 +1,21 @@ ; Test function attributes -; RUN: llvm-as < %s | llvm-dis | grep inline | count 2 +; RUN: llvm-as < %s | llvm-dis | FileCheck %s +; CHECK: define void @fn1() #0 define void @fn1() alwaysinline { ret void } +; CHECK: define void @fn2() #1 define void @fn2() noinline { ret void } +; CHECK: define void @fn3() +; CHECK-NOT: define void @fn3() #{{.*}} define void @fn3() { ret void } + +; CHECK: attributes #0 = { alwaysinline } +; CHECK: attributes #1 = { noinline } diff --git a/test/Assembler/2010-02-05-FunctionLocalMetadataBecomesNull.ll b/test/Assembler/2010-02-05-FunctionLocalMetadataBecomesNull.ll index b2256b1..df70149 100644 --- a/test/Assembler/2010-02-05-FunctionLocalMetadataBecomesNull.ll +++ b/test/Assembler/2010-02-05-FunctionLocalMetadataBecomesNull.ll @@ -22,4 +22,11 @@ define i32 @main() nounwind readonly { declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone -!0 = metadata !{i32 459008, metadata !0, metadata !0, metadata !0, i32 38, metadata !0} ; [ DW_TAG_auto_variable ] +!7 = metadata !{metadata !1} +!6 = metadata !{i32 786449, i32 0, i32 12, metadata !"/d/j/debug-test.c", metadata !"/Volumes/Data/b", metadata !"clang version 3.0 (trunk 131941)", i1 true, i1 false, metadata !"", i32 0, null, null, metadata !7, null, null} ; [ DW_TAG_compile_unit ] +!0 = metadata !{i32 786688, metadata !1, metadata !"c", metadata !2, i32 2, metadata !5, i32 0, null} ; [ DW_TAG_auto_variable ] +!1 = metadata !{i32 786478, i32 0, metadata !2, metadata !"main", metadata !"main", metadata !"", metadata !2, i32 1, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 ()* @main, null, null, null, i32 1} ; [ DW_TAG_subprogram ] +!2 = metadata !{i32 786473, metadata !"/d/j/debug-test.c", metadata !"/Volumes/Data/b", metadata !0} ; [ DW_TAG_file_type ] +!3 = metadata !{i32 786453, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!4 = metadata !{metadata !5} +!5 = metadata !{i32 786468, metadata !6, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] diff --git a/test/Assembler/ConstantExprNoFold.ll b/test/Assembler/ConstantExprNoFold.ll new file mode 100644 index 0000000..83e8909 --- /dev/null +++ b/test/Assembler/ConstantExprNoFold.ll @@ -0,0 +1,23 @@ +; This test checks to make sure that constant exprs don't fold in some simple +; situations + +; RUN: llvm-as < %s | llvm-dis | FileCheck %s + +; Even give it a datalayout, to tempt folding as much as possible. +target datalayout = "p:32:32" + +@A = global i64 0 +@B = global i64 0 + +; Don't fold this. @A might really be allocated next to @B, in which case the +; icmp should return true. It's not valid to *dereference* in @B from a pointer +; based on @A, but icmp isn't a dereference. + +; CHECK: @C = global i1 icmp eq (i64* getelementptr inbounds (i64* @A, i64 1), i64* @B) +@C = global i1 icmp eq (i64* getelementptr inbounds (i64* @A, i64 1), i64* @B) + +; Don't fold this completely away either. In theory this could be simplified +; to only use a gep on one side of the icmp though. + +; CHECK: @D = global i1 icmp eq (i64* getelementptr inbounds (i64* @A, i64 1), i64* getelementptr inbounds (i64* @B, i64 2)) +@D = global i1 icmp eq (i64* getelementptr inbounds (i64* @A, i64 1), i64* getelementptr inbounds (i64* @B, i64 2)) diff --git a/test/Assembler/externally-initialized.ll b/test/Assembler/externally-initialized.ll new file mode 100644 index 0000000..4be6e62 --- /dev/null +++ b/test/Assembler/externally-initialized.ll @@ -0,0 +1,5 @@ +; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s + +; CHECK: @G = externally_initialized global i32 0 + +@G = externally_initialized global i32 0 diff --git a/test/Assembler/fast-math-flags.ll b/test/Assembler/fast-math-flags.ll new file mode 100644 index 0000000..3a116c5 --- /dev/null +++ b/test/Assembler/fast-math-flags.ll @@ -0,0 +1,142 @@ +; RUN: llvm-as < %s | llvm-dis | FileCheck %s +; RUN: opt -S < %s | FileCheck %s + +@addr = external global i64 +@select = external global i1 +@vec = external global <3 x float> +@arr = external global [3 x float] + +define float @none(float %x, float %y) { +entry: +; CHECK: %vec = load <3 x float>* @vec + %vec = load <3 x float>* @vec +; CHECK: %select = load i1* @select + %select = load i1* @select +; CHECK: %arr = load [3 x float]* @arr + %arr = load [3 x float]* @arr + +; CHECK: %a = fadd float %x, %y + %a = fadd float %x, %y +; CHECK: %a_vec = fadd <3 x float> %vec, %vec + %a_vec = fadd <3 x float> %vec, %vec +; CHECK: %b = fsub float %x, %y + %b = fsub float %x, %y +; CHECK: %b_vec = fsub <3 x float> %vec, %vec + %b_vec = fsub <3 x float> %vec, %vec +; CHECK: %c = fmul float %x, %y + %c = fmul float %x, %y +; CHECK: %c_vec = fmul <3 x float> %vec, %vec + %c_vec = fmul <3 x float> %vec, %vec +; CHECK: %d = fdiv float %x, %y + %d = fdiv float %x, %y +; CHECK: %d_vec = fdiv <3 x float> %vec, %vec + %d_vec = fdiv <3 x float> %vec, %vec +; CHECK: %e = frem float %x, %y + %e = frem float %x, %y +; CHECK: %e_vec = frem <3 x float> %vec, %vec + %e_vec = frem <3 x float> %vec, %vec +; CHECK: ret float %e + ret float %e +} + +; CHECK: no_nan +define float @no_nan(float %x, float %y) { +entry: +; CHECK: %vec = load <3 x float>* @vec + %vec = load <3 x float>* @vec +; CHECK: %select = load i1* @select + %select = load i1* @select +; CHECK: %arr = load [3 x float]* @arr + %arr = load [3 x float]* @arr + +; CHECK: %a = fadd nnan float %x, %y + %a = fadd nnan float %x, %y +; CHECK: %a_vec = fadd nnan <3 x float> %vec, %vec + %a_vec = fadd nnan <3 x float> %vec, %vec +; CHECK: %b = fsub nnan float %x, %y + %b = fsub nnan float %x, %y +; CHECK: %b_vec = fsub nnan <3 x float> %vec, %vec + %b_vec = fsub nnan <3 x float> %vec, %vec +; CHECK: %c = fmul nnan float %x, %y + %c = fmul nnan float %x, %y +; CHECK: %c_vec = fmul nnan <3 x float> %vec, %vec + %c_vec = fmul nnan <3 x float> %vec, %vec +; CHECK: %d = fdiv nnan float %x, %y + %d = fdiv nnan float %x, %y +; CHECK: %d_vec = fdiv nnan <3 x float> %vec, %vec + %d_vec = fdiv nnan <3 x float> %vec, %vec +; CHECK: %e = frem nnan float %x, %y + %e = frem nnan float %x, %y +; CHECK: %e_vec = frem nnan <3 x float> %vec, %vec + %e_vec = frem nnan <3 x float> %vec, %vec +; CHECK: ret float %e + ret float %e +} + +; CHECK: no_nan_inf +define float @no_nan_inf(float %x, float %y) { +entry: +; CHECK: %vec = load <3 x float>* @vec + %vec = load <3 x float>* @vec +; CHECK: %select = load i1* @select + %select = load i1* @select +; CHECK: %arr = load [3 x float]* @arr + %arr = load [3 x float]* @arr + +; CHECK: %a = fadd nnan ninf float %x, %y + %a = fadd ninf nnan float %x, %y +; CHECK: %a_vec = fadd nnan <3 x float> %vec, %vec + %a_vec = fadd nnan <3 x float> %vec, %vec +; CHECK: %b = fsub nnan float %x, %y + %b = fsub nnan float %x, %y +; CHECK: %b_vec = fsub nnan ninf <3 x float> %vec, %vec + %b_vec = fsub ninf nnan <3 x float> %vec, %vec +; CHECK: %c = fmul nnan float %x, %y + %c = fmul nnan float %x, %y +; CHECK: %c_vec = fmul nnan <3 x float> %vec, %vec + %c_vec = fmul nnan <3 x float> %vec, %vec +; CHECK: %d = fdiv nnan ninf float %x, %y + %d = fdiv ninf nnan float %x, %y +; CHECK: %d_vec = fdiv nnan <3 x float> %vec, %vec + %d_vec = fdiv nnan <3 x float> %vec, %vec +; CHECK: %e = frem nnan float %x, %y + %e = frem nnan float %x, %y +; CHECK: %e_vec = frem nnan ninf <3 x float> %vec, %vec + %e_vec = frem ninf nnan <3 x float> %vec, %vec +; CHECK: ret float %e + ret float %e +} + +; CHECK: mixed_flags +define float @mixed_flags(float %x, float %y) { +entry: +; CHECK: %vec = load <3 x float>* @vec + %vec = load <3 x float>* @vec +; CHECK: %select = load i1* @select + %select = load i1* @select +; CHECK: %arr = load [3 x float]* @arr + %arr = load [3 x float]* @arr + +; CHECK: %a = fadd nnan ninf float %x, %y + %a = fadd ninf nnan float %x, %y +; CHECK: %a_vec = fadd nnan <3 x float> %vec, %vec + %a_vec = fadd nnan <3 x float> %vec, %vec +; CHECK: %b = fsub fast float %x, %y + %b = fsub nnan nsz fast float %x, %y +; CHECK: %b_vec = fsub nnan <3 x float> %vec, %vec + %b_vec = fsub nnan <3 x float> %vec, %vec +; CHECK: %c = fmul fast float %x, %y + %c = fmul nsz fast arcp float %x, %y +; CHECK: %c_vec = fmul nsz <3 x float> %vec, %vec + %c_vec = fmul nsz <3 x float> %vec, %vec +; CHECK: %d = fdiv nnan ninf arcp float %x, %y + %d = fdiv arcp ninf nnan float %x, %y +; CHECK: %d_vec = fdiv fast <3 x float> %vec, %vec + %d_vec = fdiv fast nnan arcp <3 x float> %vec, %vec +; CHECK: %e = frem nnan nsz float %x, %y + %e = frem nnan nsz float %x, %y +; CHECK: %e_vec = frem nnan <3 x float> %vec, %vec + %e_vec = frem nnan <3 x float> %vec, %vec +; CHECK: ret float %e + ret float %e +} diff --git a/test/Assembler/getelementptr.ll b/test/Assembler/getelementptr.ll index ce6866d..af03fca 100644 --- a/test/Assembler/getelementptr.ll +++ b/test/Assembler/getelementptr.ll @@ -7,12 +7,12 @@ @C = global i32* getelementptr ([2 x [3 x [5 x [7 x i32]]]]* @A, i64 3, i64 2, i64 0, i64 0, i64 7523) ; CHECK: @C = global i32* getelementptr ([2 x [3 x [5 x [7 x i32]]]]* @A, i64 39, i64 1, i64 1, i64 4, i64 5) -;; Verify that i16 indices work. +; Verify that i16 indices work. @x = external global {i32, i32} @y = global i32* getelementptr ({ i32, i32 }* @x, i16 42, i32 0) ; CHECK: @y = global i32* getelementptr ({ i32, i32 }* @x, i16 42, i32 0) -; see if i92 indices work too. +; See if i92 indices work too. define i32 *@test({i32, i32}* %t, i92 %n) { ; CHECK: @test ; CHECK: %B = getelementptr { i32, i32 }* %t, i92 %n, i32 0 @@ -20,3 +20,18 @@ define i32 *@test({i32, i32}* %t, i92 %n) { ret i32* %B } +; Verify that constant expression vector GEPs work. + +@z = global <2 x i32*> getelementptr (<2 x [3 x {i32, i32}]*> zeroinitializer, <2 x i32> <i32 1, i32 2>, <2 x i32> <i32 2, i32 3>, <2 x i32> <i32 1, i32 1>) + +; Verify that struct GEP works with a vector of pointers. +define <2 x i32*> @test7(<2 x {i32, i32}*> %a) { + %w = getelementptr <2 x {i32, i32}*> %a, <2 x i32> <i32 5, i32 9>, <2 x i32> zeroinitializer + ret <2 x i32*> %w +} + +; Verify that array GEP works with a vector of pointers. +define <2 x i8*> @test8(<2 x [2 x i8]*> %a) { + %w = getelementptr <2 x [2 x i8]*> %a, <2 x i32> <i32 0, i32 0>, <2 x i8> <i8 0, i8 1> + ret <2 x i8*> %w +} diff --git a/test/Assembler/getelementptr_vec_idx1.ll b/test/Assembler/getelementptr_vec_idx1.ll new file mode 100644 index 0000000..d2479f4 --- /dev/null +++ b/test/Assembler/getelementptr_vec_idx1.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s >/dev/null 2> %t +; RUN: FileCheck %s < %t +; Test that a vector index is only used with a vector pointer. + +; CHECK: getelementptr index type missmatch + +define i32 @test(i32* %a) { + %w = getelementptr i32* %a, <2 x i32> <i32 5, i32 9> + ret i32 %w +} diff --git a/test/Assembler/getelementptr_vec_idx2.ll b/test/Assembler/getelementptr_vec_idx2.ll new file mode 100644 index 0000000..8b71ce3 --- /dev/null +++ b/test/Assembler/getelementptr_vec_idx2.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s >/dev/null 2> %t +; RUN: FileCheck %s < %t +; Test that a vector pointer is only used with a vector index. + +; CHECK: getelementptr index type missmatch + +define <2 x i32> @test(<2 x i32*> %a) { + %w = getelementptr <2 x i32*> %a, i32 2 + ret <2 x i32> %w +} diff --git a/test/Assembler/getelementptr_vec_idx3.ll b/test/Assembler/getelementptr_vec_idx3.ll new file mode 100644 index 0000000..1f6c29b --- /dev/null +++ b/test/Assembler/getelementptr_vec_idx3.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s >/dev/null 2> %t +; RUN: FileCheck %s < %t +; Test that vector indices have the same number of elements as the pointer. + +; CHECK: getelementptr index type missmatch + +define <4 x i32> @test(<4 x i32>* %a) { + %w = getelementptr <4 x i32>* %a, <2 x i32> <i32 5, i32 9> + ret i32 %w +} diff --git a/test/Assembler/getelementptr_vec_struct.ll b/test/Assembler/getelementptr_vec_struct.ll new file mode 100644 index 0000000..ec66836 --- /dev/null +++ b/test/Assembler/getelementptr_vec_struct.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as < %s >/dev/null 2> %t +; RUN: FileCheck %s < %t +; Test that a vector struct index with non-equal elements is rejected. + +; CHECK: invalid getelementptr indices + +define <2 x i32*> @test7(<2 x {i32, i32}*> %a) { + %w = getelementptr <2 x {i32, i32}*> %a, <2 x i32> <i32 5, i32 9>, <2 x i32> <i32 0, i32 1> + ret <2 x i32*> %w +} diff --git a/test/Assembler/unnamed-addr.ll b/test/Assembler/unnamed-addr.ll index 3c94ca2..35b3b39 100644 --- a/test/Assembler/unnamed-addr.ll +++ b/test/Assembler/unnamed-addr.ll @@ -15,4 +15,6 @@ declare i32 @zed(%struct.foobar*, %struct.foobar*) ; CHECK: @bar.d = internal unnamed_addr constant %struct.foobar zeroinitializer, align 4 ; CHECK: @foo.d = internal constant %struct.foobar zeroinitializer, align 4 -; CHECK: define i32 @main() unnamed_addr nounwind ssp { +; CHECK: define i32 @main() unnamed_addr #0 { + +; CHECK: attributes #0 = { nounwind ssp } |